Subdiretorios de uma Applet em um Jar

4 respostas
G

Olá, sou novo no fórum e pesquisei muito na internet antes de entrar aqui, criei uma aplicação usando JNI, criei algumas classes em Java e testei tudo localmente, esta tudo funcionando. No meu programa um construtor de uma das classes executa um método que cria diretorios no disco e copia arquivos que estão em subdiretorios internos do meu projeto para o disco. Executando uma aplicação localmente isto funcionou perfeitamente. Em seguinda gerei um .jar, verifiquei sua estrutura interna e estava tudo ok, criei o código de uma applet e gerei uma applet assinada mas agora, quando executada apartir da applet, minha função de copiar arquivos locais do projeto para o disco não esta encontrando o diretório local. Este esta no mesmo nível da applet em geral mas não encontra. E isso ocorre somente quando executo da applet, quem invoca um .jar, e nao ocorre localmente. Alguem sabe me dizer o que esta acontecendo?

Meu codigo para ler o diretorio local é algo como:

File fileImgs = new File("imagens/azuis");
if(!fileImgs.exists()) {
     throw new Exception("ERRO: Diretório local de imagens não encontrado em: " + fileImgs.getPath());
}

Att,

4 Respostas

T

Amigo, File, FileInputStream, FileReader etc. servem para ler arquivos “soltos” (ou seja, que se encontram em diretórios no disco rígido do CLIENTE (máquina que roda o browser).

Para ler arquivos que estão dentro de um JAR (que é baixado do SERVIDOR), use getResourceAsStream ou coisa semelhante.

G

Ok, esqueci de mencionar mas a classe que faz a leitura do diretorio não esta dentro da applet e nem deve estar pois essa classe deve prover uma funcionalidade que é independente de estar sendo usado por uma applet ou por uma aplicação local.

T

Uma roda de bicicleta é diferente de uma roda de automóvel, embora ambas sejam rodas.
A classe que faz leitura de diretório deve adequar-se aos ambientes diferentes, pois uma applet é diferente de uma aplicação local. Provavelmente você deve é alterar essa classe e fazer ela usar sempre “getResourceAsStream” - se fizer as coisas direito, funciona tanto como uma applet quanto em uma aplicação local. Você não pode usar File para obter os arquivos do servidor, mas URL.

G

Olá, consegui fazer, para exemplo deixo aqui o código de como fiz:

String home = Class.forName("MinhaClasse").getProtectionDomain().getCodeSource().getLocation().toString().substring(6);
File fileJar = new File(home);
JarFile jar = new JarFile(fileJar);

Enumeration e = jar.entries();

while(e.hasMoreElements()) {
    ZipEntry  entrada = (ZipEntry) e.nextElement();
    if(!entrada.isDirectory())
    vet.add(entrada.getName());
}


/* Apartir disso eu peguei os ZipEntry, filtrei os nomes, converti para InputStream e gravei nos arquivos de saída no disco. */

Valeu.

Criado 11 de setembro de 2007
Ultima resposta 13 de set. de 2007
Respostas 4
Participantes 2