Holen Sie sich eine Liste von Ressourcen aus dem classpath Verzeichnis
Ich bin auf der Suche nach einem Weg, um eine Liste aller Ressource-Namen, der aus einem gegebenen classpath-Verzeichnis, so etwas wie eine Methode List<String> getResourceNames (String directoryName)
.
Beispiel einen classpath-Verzeichnis x/y/z
mit Dateien a.html
, b.html
, c.html
und ein Unterverzeichnis d
, getResourceNames("x/y/z")
zurückgeben sollte eine List<String>
mit den folgenden strings:['a.html', 'b.html', 'c.html', 'd']
.
Sollte es funktionieren, sowohl für die Ressourcen im Dateisystem und Gläser.
Ich weiß, dass ich kann schreiben einen kurzen Ausschnitt mit File
s JarFile
s und URL
s, aber ich möchte nicht, das Rad neu zu erfinden. Meine Frage ist, angesichts der bestehenden öffentlich zugänglichen Bibliotheken, was ist der Schnellste Weg zur Umsetzung getResourceNames
? Spring und Apache-Commons-stacks sind beide machbar.
InformationsquelleAutor viaclectic | 2010-10-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Benutzerdefinierte Scanner
Umsetzung Ihrer eigenen scanner. Zum Beispiel:
Spring Framework
Verwenden
PathMatchingResourcePatternResolver
vom Spring-Framework.Ronmamo Reflexionen
Den anderen Techniken könnte langsam zur Laufzeit für große CLASSPATH-Werte. Eine schnellere Lösung ist die Verwendung ronmamo ist Reflections-API, die precompiles die Suche zur compile-Zeit.
new Reflections("my.package", new ResourcesScanner()).getResources(pattern)
Nicht die erste Lösung funktioniert, wenn es ausgeführt wird aus der jar-Datei? Für mich geht es nicht. Ich kann die Datei Lesen, indem Sie auf diese Weise, aber nicht Lesen können-Verzeichnis.
In meinem Fall wollte ich die Liste nicht-classfile Ressourcen in einen Pfad, sondern nur die class-Dateien wurden angezeigt. Also musste ich um Sie zu verschieben in ein anderes Verzeichnis, dass nicht alle Klassen, die im entsprechenden Paket.
Die erste Methode beschrieben, die in dieser Antwort-die Lektüre der Pfad als eine Ressource, scheint nicht zu funktionieren, wenn die Ressourcen in der gleichen JAR als ausführbare code, zumindest mit OpenJDK 1.8. Der Fehler ist ziemlich seltsam -- eine NullPointerException geworfen wird, aus den tiefen der JVM-Datei-Prozess-Logik. Es ist, als ob die Designer nicht wirklich voraussehen, dass diese Nutzung von Ressourcen, und es ist nur eine teilweise Umsetzung. Selbst wenn es funktioniert auf einigen JDKs oder Umgebungen, aber dies scheint nicht dokumentiert werden, Verhalten.
Sie kann nicht Lesen-Verzeichnis, da gibt es kein Verzeichnis, sondern die Datei-streams. Diese Antwort ist die Hälfte falsch.
InformationsquelleAutor iirekm
Hier ist der code
Quelle: forums.devx.com/showthread.php?t=153784
Wenn Sie von Spring Haben Sie einen Blick auf PathMatchingResourcePatternResolver
PathMatchingResourcePatternResolver
hat den trick.Ich finde diese Lösung als nützlich für die Fälle, die Sie nicht verwenden Frühling - es wäre lächerlich, hinzufügen einer Abhängigkeit auf den Frühling, weil dieses feature nur. So, vielen Dank! "Schmutzig", aber nützlich 🙂 P. S. könnte Man verwenden möchte
File.pathSeparator
statt hart-codiert:
imgetResources
Methode.Das code-Beispiel ist system abhängig, diese stattdessen zu verwenden:
final String[] classPathElements = classPath.split(System.pathSeparator);
Nachteil: java.Klasse.path-Eigenschaft enthält möglicherweise nicht der tatsächlichen classpath laufen Sie, unter. Sie könnten alternativ-look auf der class-loader und befragen es für welche URLs es ist das laden von Klassen aus. Die andere Einschränkung ist natürlich, dass, wenn Sie tun dies unter einem SecurityManager, das ZipFile Konstruktor kann ablehnen, Ihr Zugriff auf die Datei, so sollten Sie fangen, die.
InformationsquelleAutor Jigar Joshi
Mithilfe Von Google Reflexionen:
Alles bekommen, was auf dem Klassenpfad:
Anderes Beispiel - alle Dateien mit der Erweiterung .csv - von einige.Paket:
InformationsquelleAutor NS du Toit
Wenn Sie apache verwenden commonsIO können Sie verwenden für das Dateisystem (Optional mit Verlängerung filter):
und für Ressourcen/classpath:
Wenn Sie nicht wissen, ob "Verzeichnis/" in das Dateisystem oder in Ressourcen, die Sie hinzufügen können ein
oder
bevor die Aufrufe und beide in Kombination...
Sicher, die Mittel können nicht immer Dateien, aber die Frage war über Ressourcen mit Ursprung aus Dateien/Verzeichnisse. So verwenden Sie die Beispiel-code, wenn Sie überprüfen möchten anderen Ort, z.B. wenn Sie einen config.xml in Ihrer Ressourcen für einige Standard-Konfiguration, und es sollte möglich sein, das laden einer externen config.xml stattdessen, wenn es vorhanden ist...
Und warum resourses sind nicht die Dateien? Resourses sind Dateien, die archiviert im zip-Archiv. Diese werden in den Arbeitsspeicher geladen und abgerufen werden in speziellen Weg, aber ich kann nicht sehen, warum Sie sind keine Dateien. Alle stehen im Beispiel der Ressource, ist nicht eine Datei im Archiv'?
Funktioniert nicht (NullPointerException), wenn die Zieldatei ist ein Verzeichnis, das sich innerhalb einer JAR-Datei (also die JAR enthält die Wichtigsten app-und das Ziel-Verzeichnis)
InformationsquelleAutor Rob
So, in Bezug auf die PathMatchingResourcePatternResolver dies ist, was gebraucht wird in den code:
classpath*:config/*.xml
InformationsquelleAutor Pavel Kotlov
Verwendet eine Kombination von Rob ' s Antwort.
InformationsquelleAutor Trevor
Den
Spring framework
'sPathMatchingResourcePatternResolver
ist wirklich genial für diese Dinge:Maven-dependency:
InformationsquelleAutor BullyWiiPlaza
Mit Feder ist es einfach. Sei es eine Datei oder Ordner oder auch mehrere Dateien, gibt es Chancen, die Sie tun können, es mittels Injektion.
Diesem Beispiel wird veranschaulicht, die Injektion von mehreren Dateien, die sich in
x/y/z
Ordner.Es funktioniert für Ressourcen im Dateisystem als auch in die Gläser.
private Resource[] Ressourcen; hat den trick für mich. Haben Suche Stunden! Danke!
InformationsquelleAutor naXa
Sollte das funktionieren (wenn der Frühling ist nicht nur eine option):
Funktioniert nicht mit Java-9 - "Protokoll" ist nun "jrt".
Danke @ArnoUnkrig - bitte teilen Sie Ihre aktualisierte Lösung, wenn Sie mögen
InformationsquelleAutor fl0w
Ich denke, Sie können nutzen Sie die [Zip-Datei-System-Anbieter][1] um dies zu erreichen. Bei der Verwendung von
FileSystems.newFileSystem
es sieht aus wie Sie behandeln können die Objekte in der ZIP, wie eine "normale" Datei.In der verlinkten Dokumentation über:
In der Dokumentation für die
jdk.zipfs
- Modul in [Java 11 Staaten][5]:Hier ist ein erfundenes Beispiel, ich habe mit deinem Beispiel Ressourcen. Beachten Sie, dass eine
.zip
ist ein.jar
, aber Sie könnte passen Sie Ihre code zu verwenden classpath-Ressourcen:Setup
Java
Ausgabe
InformationsquelleAutor mkobit
Basierend auf @rob 's Angaben oben, habe ich die Umsetzung, die ich die Freigabe an die öffentlichkeit:
Während ich nicht erwartet hätte, dass
getResourcesAsStream
dazu, so zu arbeiten, dass auf ein Verzeichnis, das tut es wirklich und es funktioniert gut.InformationsquelleAutor Deven Phillips