2010-01-20 14 views
5

Tengo un proyecto en el que quiero acceder a un recurso en un JAR de otro proyecto. No está en mi classpath, entonces ClassLoader no es una opción. Intenté:Abrir un recurso JAR como un FileStream

 

new FileInputStream("C:\\mydir\\my.jar!\\myresource.txt"); 
 

y recibí una excepción FileNotFoundException.

JarInputStream podría ser una posibilidad, pero quiero que la flexibilidad del nombre de archivo de entrada sea un recurso jar o simplemente un archivo en el sistema (el usuario decide). ¿Hay alguna clase que pueda hacer esto o tengo que construir uno yo mismo?

+1

No estoy seguro de si ayuda, pero los archivos jar son básicamente archivos zip, por lo que si puede leer algo de un archivo comprimido, puede leerlo de la misma manera, quizás eso ayude a ampliar su búsqueda. –

+1

@Mark - Los archivos JAR son esencialmente archivos ZIP, pero solo por el momento. Corre el rumor de que el formato JAR está cambiando en Java 7. Con suerte, el uso de las clases de abstracción adecuadas protegerá el futuro de cualquier código de manipulación JAR (consulte el paquete 'java.util.jar'). – McDowell

Respuesta

0

Pruebe con un URLClassLoader. He hecho algo similar a esto antes, y parece funcionar (aunque es posible que tenga que rebuscar en su archivo de políticas de seguridad, si está en una JVM segura).

0

tratar de usar java.net.JarURLConnection

URL url = new URL ("jar: archivo: C: \ mydir \ my.jar \ myresource.txt ");

JarURLConnection jarConnection = (JarURLConnection) url.openConnection();

0
private InputStream twistLid(File jar, String resource) throws IOException { 
    return new URL("jar:" + jar.toURI() + "!" + resource).openStream(); 
    } 
0

Basándose en el trabajo de muchos más arriba, esto es un ejemplo en el maravilloso, con indicación del texto contenido en 'resource.txt' dentro de una carpeta llamada '' reources en el nivel raíz de un archivo jar

import java.io.* 
import java.util.* 
import java.util.jar.* 

def getJarResourceAsStream(String jarName, String resource) throws IOException { 
    def resourceStr = 'jar:' + (new File(jarName)).toURI() + '!' + resource 
    return new URL(resourceStr).openStream() 
} 

def inputStream = getJarResourceAsStream('/some/file/path/myJar.jar', '/resources/resource.txt') 

def reader = new InputStreamReader(inputStream) 
BufferedReader buffer = new BufferedReader(reader) 
String line 
while((line = buffer.readLine()) != null) { 
    System.out.println(line) 
} 
Cuestiones relacionadas