Files über Classpath laden

reibi

Top Contributor
Hi

Wenn ich unbekannt viele Files aus einem Verzeichnis laden will kann ich das ja so machen:

Java:
        File[] myFiles = myDir.listFiles(myFilter);

Das funktioniert prima wenn ich den Pfad kenne.

Wenn ich aber die Files über den Klassenpfad laden muss, da sie sich in einem von Maven gebieldeten Artifakt befinden geht das nicht mehr.

Einzelfiles bei denen der Name bekannt ist, lade ich so:

Java:
ClassLoader.getSystemResourceAsStream("cpconf/cpconf.properties");

blos wie mache ich das bei Dateien wo der Name(und die Anzahl) nicht bekannt ist?


Gruss

reibsen;-)
 
Zuletzt bearbeitet:

reibi

Top Contributor
nee ...nur die Files aus einem bestimten verzeichnis(in dem Fall package) .. dh nicht alle Files aus dem Classpath
 

reibi

Top Contributor
Ist nicht in jedem file ein jar-file. Erst nach dem builden mit Maven ist es ein Jar-file ... ansonsten liegt das Zeug im Resource-Verzeichnis, welches maven zu einem source-folder für eclipse macht.

Also in jedem Fall in einem richtigen package und man kann ausschliesslich über "ClassLoader.getSystemResourceAsStream" drauf zugreifen. Das bedeutet es muss irgendwie über Reflection gehen.
 

Otzelot

Mitglied
Java:
			BufferedReader is = new BufferedReader(new InputStreamReader(ClassLoader.getSystemResourceAsStream("bilder/")));
			
			String line = "";
			while((line = is.readLine())!= null)
				System.out.println(line);

Wenn du dir die Ausgabe anguckst werden alle Datein innerhalb dieses Ordner ausgegeben. Diese kannst du speichern und dann irgendwie weiterverarbeiten, wenn du das ganze dynamisch programmierst sollte das kein Problem mit unterschiedlich vielen Dateien sein.

EDIT: Ich weiß allerdings nicht was dein Code macht der ganz oben steht. Eventuell kannst du dort irgendwie den Pfad über den ClassLoader mit reinbringen?
 
Zuletzt bearbeitet:

reibi

Top Contributor
Hi

das funktioniert nur ungbebunden, zB wenn ichs in meinem Eclipse starte...
Gebunden(in nem JarFile) läuft das nicht mehr.

keine ausgabe, (sprich kein File)
Der Punkt ist, dass es sich nicht mehr um ein Verzeichnis handelt.

Schau
[Java]
URL url = ClassLoader.getSystemResource("test/test");
System.out.println(url.toString());
[/Java]


Gibt ungebunden folgende Ausgabe:
file:/C:/Workspaces/WS_X/myPRJ/target/classes/test/test

und gebunden diese:
jar:file:/C:/Workspaces/WS_X/myPRJ/target/z_weg-1.0-SNAPSHOT.jar!/test/test


verstehste?


Gruss und trotzdem danke fürs kopfzerbrechen ;-)
 
M

maki

Gast
Klar geht das :)

ClassLoader.getResourceAsStream ist etwas anderes als getSystemResource#getSystemResource, 'ne URL ist doch überflüssig wenn man den Stream bereits hat.
 

reibi

Top Contributor
Hi Maki und Otzelot

propiert doch mal das aus, dann seht Ihr das es nicht geht.

Java:
        BufferedReader is = new BufferedReader(new InputStreamReader(ClassLoader.getSystemResourceAsStream("java/lang/")));
        
        String line = "";
        while((line = is.readLine())!= null)
            System.out.println(line);

Da gibts ne :: java.lang.NullPointerException


Gruss ;-)
 
M

maki

Gast
Du musst schon aufpassen was du da machst.

Es gibt Unterschiede zwischen
Java:
ClassLoader.getSystemResourceAsStream
ClassLoader.getResourceAsStream
Class.getResourceAsStream
heissen alle ähnliche, und funktionieren alle leicht anders ;)

NOrmalerweise nimmt man ClassLoader.getResourceAsStream
 

reibi

Top Contributor
Hallo maki


probier mal bitte aus:

Java:
public class App {
    InputStream getIS2(String pack) {
        return this.getClass().getClassLoader().getResourceAsStream(pack);
    } // end getIS2()

    InputStream getIS3(String pack) {
        return this.getClass().getResourceAsStream(pack);
    } // end getIS3()

    public static void main(String[] args) throws Exception {
        String pack = "java/lang/";

        InputStream myIS1 = ClassLoader.getSystemResourceAsStream(pack);
        InputStream myIS2 = (new App()).getIS2(pack);
        InputStream myIS3 = (new App()).getIS3(pack);

        try {
            BufferedReader myBR = new BufferedReader(new InputStreamReader(myIS1));
            String line = "";

            while ((line = myBR.readLine()) != null)
                System.out.println(line);
        } // end try
        catch (Exception e) {
            e.printStackTrace();
        } // end catch

        try {
            BufferedReader myBR = new BufferedReader(new InputStreamReader(myIS2));
            String line = "";

            while ((line = myBR.readLine()) != null)
                System.out.println(line);
        } // end try
        catch (Exception e) {
            e.printStackTrace();
        } // end catch

        try {
            BufferedReader myBR = new BufferedReader(new InputStreamReader(myIS3));
            String line = "";

            while ((line = myBR.readLine()) != null)
                System.out.println(line);
        } // end try
        catch (Exception e) {
            e.printStackTrace();
        } // end catch
    } // end main()
} // end App


Bei mir liefern alle 3 Methodiken eine "NullZeigerAusnahme"

Grüsschen
 
M

maki

Gast
Reibi, was genau willst du denn als Stream laden? ;)

Muss schon eine Ressource dasein :)

Ansosnten, wie gesagt: Die Methoden funktionieren alle leicht anders.

In einem Jar/War/Ear kann man Ressourcen nur als Streams laden, das geht, schon seit Jahren :)
 

reibi

Top Contributor
Also ich will dynamisch (bzw. generisch) an die Inhalte eines Packages rankommen.

sprich ich will das hier:

[Java]
File[] myFiles = myDir.listFiles(myFilter);
[/Java]

mit maven(oder nach maven) machen.

verstehste ;-)
 

mvitz

Top Contributor
Das Problem des TOs ist es, dass er x-beliebige Dateien mit unbekannten Namen über den Classpath laden möchte.

Ich habe mich mit der Problematik noch nicht genauer beschäftigt, kann mich aber an viele ähnliche Threads hier erinnern, in der das Ergebnis war, dass dies nicht geht.
Als Ersatzidee wäre es evtl. ein bekanntes File zu erstellen, dass die Pfade/Namen aller anderen Ressourcen enthält, dann könntest du das bekannte File auslesen und anschließend nacheinander jedes der dort referenzierten Files laden.
 

reibi

Top Contributor
Als Ersatzidee wäre es evtl. ein bekanntes File zu erstellen, dass die Pfade/Namen aller anderen Ressourcen enthält, dann könntest du das bekannte File auslesen und anschließend nacheinander jedes der dort referenzierten Files laden.

Das hab ich mir auch schon überlegt (auch als ErsatzIdee ;-) ) fände das aber nich so doll, da mab Informationen immer doppet hosten muss und sich dadurch auch ein zusätzlichs Fehlerpotential ergibt.

Aber danke für die Idee ;-)
 
M

maki

Gast
Also ich will dynamisch (bzw. generisch) an die Inhalte eines Packages rankommen.

sprich ich will das hier:

[Java]
File[] myFiles = myDir.listFiles(myFilter);
[/Java]
...
Da bist du auf dem Holzweg, kannst nicht einfach sagen "Gib mir alle klassen von diesem Package", dafür ist getRessourceAsStream nicht da.
getRessourceAsStream gibt dir eine Classpathressource als InputStream zurück ;)
zB. Property Dateien, XML Dateien, Bilder, etc. pp.
 

reibi

Top Contributor
AT: mvitz und maki

Also stellt Euch mal folgende Problematik vor:

Nur als Beispiel:
Ihr habt einen Sack voll Sprachfiles. Wobei nicht klar ist ob es 2 oder 10 sind.

Bekannten Dateien wie zB "main.properties" kann man problemlos getResourceAsStream laden

aber bei unbekannten leider nicht. Dafür muss man mir sagen, was der Inhalt des Verzeichnisses ist.

Ohne Classpath laden(was ja bei projekten ohne Maven ganz gut geht) kann man das so machen:

Java:
 File[] myFiles = myDir.listFiles(myFilter);

Benutzt man maven, ist man auf einmal gezwungen seine Properties über den Classpath zu laden. das funzt auch gut bei bekannten Dateien ... bei unbekannten aber irgendwie, sehr leider nicht. ;-(
 
M

maki

Gast
reibi, dein Problem hat rein gar nix mit Maven zu tun, man muss Resourcen immer über den CP als Stream laden, sonst funktioniert das nicht in Jars, Wars, EARs, etc. pp.

Nur als Beispiel:
Ihr habt einen Sack voll Sprachfiles. Wobei nicht klar ist ob es 2 oder 10 sind.
Dafür nimmt man RessourceBundles, da geht das dann automatisch mit der entsprechen Locale.
 

Otzelot

Mitglied
Hallo maki

Bei mir liefern alle 3 Methodiken eine "NullZeigerAusnahme"

Grüsschen

Alle 3 Methoden funktionieren bei mir auch gebunden in einer .jar. Der Unterschied ist nur, dass man wenigstens den Namen der .jar angeben will bzw. da bei den .class Datein kein Ordner "java/lang" bei mir existiert funktioniert sie natürlich nicht wenn ich sie einfach nur kopiere.

Wenn du die .jar jetzt als Beispiel: test.jar nennst dann ersetzt du deinen String pack = "java/lang"; durch "test.jar" dann werden dir alle Dateien innerhalb der .jar ausgegeben. Zugegeben in einer jar funktioniert das ganze nicht mehr sogut, weil viele komische Sonderzeichen zwischen den Namen kommen, aber diese lassen sich auch rausfiltern.

Ersetz du den String pack durch = ""; dann werden dir alle Datein ausgegebn in der sich die .jar befindet dort kann man dann nach der .jar suchen und den Pfad entsprechend ändern....wenn man es komplett dynamisch machen will.
 

KrokoDiehl

Top Contributor
Hallo. Auch wenn es dem TO vielleicht nicht wirklich hilft, aber ich hatte mal ein ähnliches Problem und auch dazu hier im Forum einen Thread gestartet (zu faul zum suchen... :oops:). Bei mir ging es u.A. um den Unterschied der Methoden
Code:
ClassLoader.getResource()
und
Code:
ClassLoader.getResource[B]s[/B]()
. Letztlich aber ist es harter Fakt, dass man über den ClassLoader nicht mehrere Dateien (InputStreams, URLs) aus einem Verzeichnis im JAR laden/suchen kann. Es gibt Workarounds die über JarFile und ZipFileSet und sowas gehen, aber das ist der Sache auch nicht zuträglich.

Mal von anderen Vorschlägen abgesehen, geht es einfach nicht, via ClassLoader Verzeichnisse auszulesen. :)


*edit*
Oh, was ich noch schreiben wollte: Meine Lösung war letztlich so, dass ich über eine andere Quelle an die gewünschten Informationen gekommen bin:
Es ging konkret um Grafiken in einem JAR. Da ich aber bereits über Properties alle verfügbaren Grafikresourcen benannte hatte, war dies meine letztlich meine Datenquelle und ich bekam daraus alle Namen/Pfade im Jar.
 
Zuletzt bearbeitet:

reibi

Top Contributor
.. geht es einfach nicht, via ClassLoader Verzeichnisse auszulesen. :)

Das ist der Punkt, es geht irgendwie nicht!

Man kann keine Verzeichnisse über Classloader uslesen, sondern nur Dateien, bei denen der Name bekannt ist.
Bei Verzeichnisen wo der Name bekannt ist, geht das offensichtlich nicht.

Genau das ist auch mein Problem, an dem ich fast verweifele ;-( ... ich sollte mich zum Förster umschulen lassen ..

Gruss und Dank an alle die sich für mich den Koppp zerbrechen ;-)
 

reibi

Top Contributor
.. da bei den .class Datein kein Ordner "java/lang" bei mir existiert funktioniert sie natürlich nicht wenn ich sie einfach nur kopiere...

also das package "java/lang" gibts bei jedem

... dann werden dir alle Datein ausgegebn in der sich die .jar befindet ...

Es geht aber nicht nur um jar-dateien... es geht um mvn-artifakte, welche zum einen als Eclipse-PRJ vorliegen oder als jar-Datei...

Der Zugriffsmechano MUSS der Gleiche sein! Ansonsten bringts mir nichts.

Wie ich ein jar-File durchsuche, bzw wie ich ein Verzeichnis durchsuche ist mir ja beides klar, blos auf ne unterschiedliche art und Weise. Und genau das ist das Problem. Wenn es nicht gleich ist muss ich jedesmal die Artifakte ändern, je nach dem auf welche Art ich sie benutze ... verstehste?

Grüssli ;-)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Input/Output Zip Files über Socket senden und empfangen Allgemeine Java-Themen 6
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
H Mehrere PNG-Files in einer Datei Allgemeine Java-Themen 9
R Delete files before creating new from temp using Java file method Allgemeine Java-Themen 1
X Files.walkFileTree zählt nicht richtig Allgemeine Java-Themen 2
L Mehrere .Jar Files aufrufen Allgemeine Java-Themen 9
P Am Application Server - Selbe files aber trotzdem CNF Allgemeine Java-Themen 2
B Maven Zugriff auf files aus einem kompilierten jar Allgemeine Java-Themen 15
S Eigenschaften (hier Verknüpfung) eines Files lesen Allgemeine Java-Themen 2
M *.class Files ausführen Allgemeine Java-Themen 2
F Java moved Files statt sie zu kopieren Allgemeine Java-Themen 12
B Existenz eines Files max 30 sec prüfen Allgemeine Java-Themen 5
J Java Software Compare Files und Neue File erstellen Allgemeine Java-Themen 0
X Wav-Files abspielen Allgemeine Java-Themen 2
L Zwei Files miteinander vergleichen und Grafisch darstellen Allgemeine Java-Themen 1
W audio files metadaten Allgemeine Java-Themen 2
M Threads Excel files bearbeiten Allgemeine Java-Themen 4
J Wie kann man .txt Files übers Internet verschicken? Allgemeine Java-Themen 53
V Files mit Umlauten ergeben keine Größe Allgemeine Java-Themen 9
K Zip-Archive mit temporären Files erstellen Allgemeine Java-Themen 16
M Verschlüsselung von Text und Files durch RSA (Encoding Problem) Allgemeine Java-Themen 7
M wav-files kanäle zusammenfügen + pitchen Allgemeine Java-Themen 6
R Löschen von Files nicht möglich Allgemeine Java-Themen 11
B Files.isDirectory Allgemeine Java-Themen 14
P Ordnerstruktur nach .js-Files durchsuchen Allgemeine Java-Themen 2
L Class Files , Methode .delete() Allgemeine Java-Themen 13
P Files - nach der reihe String reinschreiben Allgemeine Java-Themen 2
J Laden von JAR Files geht ohne ADMIN Rechte sehr langsam Allgemeine Java-Themen 6
A Navigation zu Files innerhalb jar Allgemeine Java-Themen 3
P JAVA Bilder/Videos in Form von Files vergleichen Allgemeine Java-Themen 7
B Eclipse Attache source to own jar-files Allgemeine Java-Themen 2
B Permissions of Folders/Files Allgemeine Java-Themen 6
A External Sort - too many open files Allgemeine Java-Themen 6
E Files Kopieren Allgemeine Java-Themen 8
V Mac: Paketinhalt eins Files öffnen, wie? Allgemeine Java-Themen 3
M Übergabe mehrer Files an selbstprogrammieren Parser Allgemeine Java-Themen 4
reibi Separator in java.util.Properties-Files Allgemeine Java-Themen 3
M Webservices: WSDL Files ohne "Service" Element? Allgemeine Java-Themen 4
ruutaiokwu System.out auf files umlenken in log4j.xml Allgemeine Java-Themen 4
X Log files monitoren Allgemeine Java-Themen 7
S Viele zip-files zu einem kombinieren..? Allgemeine Java-Themen 3
B Öffnen und schließen von Pdf-Files Allgemeine Java-Themen 8
T Class-files zur Laufzeit zu Reflection-Zwecken laden Allgemeine Java-Themen 18
R in .jar werden files nicht gefunden!!! Allgemeine Java-Themen 5
N Fehler mit Jar-Files Allgemeine Java-Themen 9
J BufferedImage aus PNG Files haben keinen Type Allgemeine Java-Themen 4
U Properties in Jar Files Allgemeine Java-Themen 3
Developer_X Extract Zip Files with Java Allgemeine Java-Themen 21
N 2 files auf gleichheit vergleichen Allgemeine Java-Themen 5
A Get all Files in Workspace Allgemeine Java-Themen 9
Quaxli Files massenhaft löschen Allgemeine Java-Themen 3
N Versionierung von jar-Files Allgemeine Java-Themen 5
Daniel_L Best Practice zum Löschen von Log-Files? Allgemeine Java-Themen 8
V aus mehreren jar files, ein großes basteln Allgemeine Java-Themen 22
J Too many open files Allgemeine Java-Themen 11
J Eclipse: Einbindung von jar-Files funktioniert nicht Allgemeine Java-Themen 4
O .jar Files - Tools zum generieren Allgemeine Java-Themen 25
A Problem: Mehrere PDF-Files nacheinander Öffnen Allgemeine Java-Themen 12
A jpeg Files mit eigenem Programm öffnen Allgemeine Java-Themen 4
M Embedded Files aus PDF extrahieren Allgemeine Java-Themen 3
J Too many files open Allgemeine Java-Themen 4
M Debuggen von Code in jar-Files? Allgemeine Java-Themen 5
G Sonderzeichen für Files Allgemeine Java-Themen 5
G bestimmte Files suchen Allgemeine Java-Themen 2
reibi Classenpath mit mehreren gleichen jar-Files Allgemeine Java-Themen 7
M Die gleiche Klasse in mehreren JAR files Allgemeine Java-Themen 5
M Probleme mit jar-files Allgemeine Java-Themen 5
G Bearbeiten von Files in einem Thread Allgemeine Java-Themen 4
reibi Klassenpfad für jar-Files Allgemeine Java-Themen 7
J Alte Log Files löschen mit log4j Allgemeine Java-Themen 3
D Files umbenennen mit renameTo() Allgemeine Java-Themen 5
I Pfadangabe zu Files Allgemeine Java-Themen 2
X PowerPoint Files in Java erzeugen Allgemeine Java-Themen 2
sparrow Ant build-files rekursiv aus ant aufrufen Allgemeine Java-Themen 3
K "Too many open files" bei Property List Allgemeine Java-Themen 5
T Mp3 files? Allgemeine Java-Themen 2
I Files einlesen Allgemeine Java-Themen 3
I Diverse Files aus Ordner auslesen Allgemeine Java-Themen 10
mabu Erstellen/Entpacken von Cabinet-Files Allgemeine Java-Themen 12
T Jar-Files und JVM-Cache? Allgemeine Java-Themen 2
P eingebundene *.jar- Files Allgemeine Java-Themen 28
G policy files laden? Allgemeine Java-Themen 8
T Files an das Betriebsystem übergeben such ideen! Allgemeine Java-Themen 3
M auf files des packages zugreifen Allgemeine Java-Themen 2
A Versionierung von Class-Files Allgemeine Java-Themen 10
vogella Korrektur der Filetypenzuordnung für .jar Files unter Window Allgemeine Java-Themen 2
S Files umbennen Allgemeine Java-Themen 4
M laden von Klassen aus jar files Allgemeine Java-Themen 2
R Drag und Drop von externen Files geht nur als Application Allgemeine Java-Themen 2
V Jar Files Auf meinem Handy Allgemeine Java-Themen 7
D Files einlesen (XML Files) Allgemeine Java-Themen 2
N Problem mit jar und ant: kann files nicht lesen! Allgemeine Java-Themen 15
P Fortschrittszustand von gezippten Files anzeigen Allgemeine Java-Themen 6
S JAR-Files Allgemeine Java-Themen 6
F Alle Files im Ordner nach Dateinamen durchsuchen Allgemeine Java-Themen 28
P Fehlermeldung beim Speichern eines java files Allgemeine Java-Themen 5
P jar files einbinden (Eclipse) Allgemeine Java-Themen 2
G Probleme mit Class Files Allgemeine Java-Themen 16
G rar files dekomprimieren Allgemeine Java-Themen 4
V INI Files, Properties etc. Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben