2010-01-20 5 views
5

Ich habe ein Projekt, wo ich auf eine Ressource in einer JAR von einem anderen Projekt zugreifen möchte. Es ist nicht auf meinem Klassenpfad, daher ist ClassLoader keine Option. Ich habe versucht:Öffnen einer JAR-Ressource als FileStream

 

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

und erhielt eine FileNotFoundException.

JarInputStream ist möglicherweise eine Möglichkeit, aber ich möchte die Flexibilität des Eingabedateinamens als jar-Ressource oder nur eine Datei auf dem System (Benutzer entscheidet). Gibt es eine Klasse, die das kann oder muss ich selbst eine bauen?

+1

Nicht sicher, ob es hilft, aber JAR-Dateien sind grundsätzlich ZIP-Dateien. Wenn Sie also etwas aus einer ZIP-Datei lesen können, können Sie es auf die gleiche Weise aus einem Jar lesen - vielleicht erweitert das Ihre Suche. –

+1

@Mark - JAR-Dateien sind im Wesentlichen ZIP-Dateien, aber nur für den Moment. Gerüchten zufolge ändert sich das JAR-Format in Java 7. Hoffentlich wird die Verwendung der entsprechenden Abstraktionsklassen jeden JAR-Manipulationscode zukunftssicher machen (siehe Paket 'java.util.jar'). – McDowell

Antwort

0

Versuchen Sie mit einem URLClassLoader. Ich habe etwas Ähnliches zuvor gemacht und es scheint zu funktionieren (obwohl Sie möglicherweise mit Ihrer Sicherheitsrichtliniendatei herumspielen müssen, wenn Sie in einer sicheren JVM sind).

0

try java.net.JarURLConnection mit

URL url = new URL ("jar: file: 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

Aufbauend auf der Arbeit viele oben, hier ist ein Beispiel in stark, um den Text in ‚resource.txt‘ in einem Ordner enthaltenen Auflistung namens ‚reources‘ auf der obersten Ebene einer JAR-Datei

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) 
}