2011-03-02 17 views
8

Necesito poder acceder a un archivo almacenado en un archivo jar compilado. He descubierto cómo agregar el archivo al proyecto, pero ¿cómo lo haría en el código? ¿Cómo podría copiar un archivo del archivo jar a una ubicación en el disco duro del usuario? Sé que hay docenas de formas de acceder a un archivo (FileInputStream, FileReader, etc.), pero no sé cómo mirar dentro de sí mismo.¿Tiene acceso al archivo en el archivo jar?

Respuesta

17

usted podría utilizar algo como esto:

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

Si foo.txt estaba en la raíz del archivo JAR, que tendría que utilizar:

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

asume la clase está en el mismo archivo JAR que el recurso, creo.

+0

Parte de lo que necesito es BufferedReader que necesita un FileReader como una imput. ¿Cómo puedo convertir un InputStream a un FileReader? – LRFLEW

+0

Acabas de jugar conecta los puntos con la documentación de Java. Mire BufferedReader - En la sección Vea también, hay FileReader y InputStreamReader. Vaya a InputStreamReader, etc. –

+0

Sí, puedo hacerlo, pero busqué BufferedReader y encontré la clase de partición BufferInputStream que es lo que necesito usar: P. – LRFLEW

1

Mire la clase JarFile. Todo lo que necesita para obtener el InputStream de una entrada específica en el archivo jar está allí.

4

Puede usar getResource() para obtener un URL para un archivo en el classpath o getResourceAsStream() para obtener un InputStream en su lugar.

Por ejemplo:

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

Puede leer el contenido de un archivo JAR utilizando la clase JarFile.

Aquí hay un ejemplo de cómo se puede obtener un archivo específico de un archivo JAR y extraerlo:

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(); 
} 
0

sólo quería añadir que si queremos acceder a archivos dentro de tarro que se encuentra en la siguiente ruta :

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

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

tendrá que utilizar siguiente código (tener en cuenta que hay nO carácter "/" (barra diagonal) en el inicio de la ruta):

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