Acessar o arquivo no arquivo jar?

Eu preciso ser capaz de acessar um arquivo armazenado em um arquivo jar compilado. Eu descobri como adicionar o arquivo ao projeto, mas como eu faria referência no código? Como posso copiar um arquivo do arquivo jar para um local no disco rígido do usuário? Eu sei que existem dezenas de maneiras de acessar um arquivo (FileInputStream, FileReader, ect.), Mas eu não sei como olhar para dentro de si mesmo.

Você poderia usar algo assim:

InputStream is = this.getClass().getClassLoader().getResourceAsStream(fileFromJarFile);

Se foo.txt estivesse na raiz do seu arquivo JAR, você usaria:

InputStream is = this.getClass().getClassLoader().getResourceAsStream("foo.txt");

assume que a class está no mesmo arquivo JAR que o recurso, acredito.

Você pode ler o conteúdo de um arquivo JAR usando a class JarFile .

Aqui está um exemplo de como você pode obter um arquivo específico de um arquivo JAR e extraí-lo:

 JarFile jar = new JarFile("foo.jar"); String file = "file.txt"; JarEntry entry = jar.getEntry(file); InputStream input = jar.getInputStream(entry); OutputStream output = new FileOutputStream(file); try { byte[] buffer = new byte[input.available()]; for (int i = 0; i != -1; i = input.read(buffer)) { output.write(buffer, 0, i); } } finally { jar.close(); input.close(); output.close(); } 

Você pode usar getResource () para obter uma URL para um arquivo no caminho de class ou getResourceAsStream () para obter um InputStream.

Por exemplo:

 BufferedReader reader = new BufferedReader(new InputStreamReader( this.getClass().getResourceAsStream("foo.txt"))); 

Só queria adicionar isso se quisermos acessar o arquivo dentro do Jar que está localizado no seguinte caminho:

 Windows: c:\your-jar-file.jar\dir1\dir2\dir3\foo.txt Linux: /home/your-jar-file.jar/dir1/dir2/dir3/foo.txt 

Será necessário usar o seguinte código (preste atenção que não há nenhum caractere “/” (barra invertida) no início do caminho):

 InputStream is = this.getClass().getClassLoader().getResourceAsStream("dir1/dir2/dir3/foo.txt"); 

Veja a class JarFile. Tudo o que você precisa para obter o InputStream de uma input específica no arquivo jar está lá.