Gibt es in Java eine Möglichkeit, eine Dateiinstanz für eine Ressource zu erstellen, die über den Classloader aus einem JAR abgerufen wurde?
Meine Anwendung verwendet einige Dateien aus dem JAR (Standard) oder aus einem zur Laufzeit angegebenen Dateisystemverzeichnis (Benutzereingabe). Ich suche nach einer konsistenten Möglichkeit,
a) diese Dateien als Stream zu laden,
b) die Dateien im benutzerdefinierten Verzeichnis bzw. im Verzeichnis im JAR aufzulisten
Bearbeiten: Anscheinend wäre der ideale Ansatz, sich von java.io.File insgesamt fernzuhalten. Gibt es eine Möglichkeit, ein Verzeichnis aus dem Klassenpfad zu laden und dessen Inhalt (darin enthaltene Dateien / Entitäten) aufzulisten?
quelle
InputStream
Sie vongetResourceAsStream
Stopps erhalten, um die Bytes der Ressource nach dieser Größe abzurufen, und stattdessen 0 zurückgibt, wenn sie in einem komprimierten Dateisystem wie einem JAR enthalten ist.getResource
In diesem Fall scheinen Sie gezwungen zu sein, die Datei unabhängig davon zu verwenden und zu laden.read
Methode zurückzuführen, mit der entschieden wurde, wie viele Daten gelesen werden sollten (das war mir nicht bewusst). Und es scheint, dass die gesamte Datei gelesen wird, wenn sich die gelesene Datei in einem regulären Ordner befindet. Befindet sich die Datei in einem JAR, weil sie verpackt wurde, werden nur Teile davon gelesen.InputStream
sollten Sie, wenn Sie die gesamte Ressource lesen möchten, eine Schleife ausführen, bisread
-1 zurückgegeben wird.Ich hatte das gleiche Problem und konnte Folgendes verwenden:
quelle
FileSystem
Objekt erstellen und dasPath
daraus abrufen . Dann können Sie es wie gewohnt lesen. (siehe stackoverflow.com/a/22605905/1876344 )Hier ist ein bisschen Code aus einer meiner Anwendungen ... Lassen Sie mich wissen, ob er Ihren Anforderungen entspricht. Sie können dies verwenden, wenn Sie die Datei kennen, die Sie verwenden möchten.
Hoffentlich hilft das.
quelle
toURI()
wird scheitern.Eine zuverlässige Methode zum Erstellen einer Dateiinstanz für eine aus einem JAR abgerufene Ressource besteht darin, die Ressource als Stream in eine temporäre Datei zu kopieren (die temporäre Datei wird beim Beenden der JVM gelöscht):
quelle
Versuche dies:
Es stehen weitere Methoden zur Verfügung, z. B. hier: http://www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html
quelle
Dies ist eine Option: http://www.uofr.net/~greg/java/get-resource-listing.html
quelle