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());
}
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.
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.
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.
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. */