Zugriff auf "resources"

i.b.fan

Aktives Mitglied
Hallo,

ich würde gern auf einen Unterordner von "resources" in meinem Projekt zugreifen wie auf einen normalen Ordner. D.h. ich möchte z.B. den Inhalt des Ordners auslesen können wie in diesem Beispiel:

Java:
String dir = "C:\\test\\ico";
File file = new File(dir);
String[] icons = file.list();

for(int i=0; i<icons.length; i++){
System.out.println(icons[i]);
}

Ich habe bisher nur die Möglichkeit gefunden, auf Dateien zuzugreifen, deren Name ich kenne und fest codieren muss:

Java:
java.net.URL icoDIR = getClass().getResource("resources/icons/");
//immerhin im richtigen Verzeichnis gelandet, muss aber jede Datei mit Namen kennen:
machWasMit(icoDIR + "icon1.png")

Gibt es da nicht so eine Methode wie file.list() für "resources", mit der ich allgemeiner arbeiten kann? ???:L

Vielen Dank im Voraus für Tipps und/oder Links! 🙂

i.b.fan
 
Resources müssen immer namentlich bekannt sein. Man kann sie nicht wie Dateien auflisten. Du bekommst eine Adresse der Resource (URL). So wie im Webbrowser. URLs referenzieren genau eine Resource, sie können nicht dazu benutzt werden, mehrere Resourcen abzufragen oder aufzulisten. Resourcen sind nunmal meist keine Dateien in einem Dateisystem.

Die Adresse kann zum Beispiel zu einem Eintrag in einer Datenbank zeigen, zu einer Datei auf einem Webserver (per HTTP), als Datei in einem Verzeichnis, als Eintrag in einer ZIP-Datei, oder irgendwo ganz anders. Wohin genau die Adresse zeigt hängt vom ClassLoader der Klasse ab, über die Du die Resource laden möchtest.

Aber wenn Du uns verrätst was Du eigentlich machen möchtest, findet sich vielleicht (bestimmt) ein Weg der ohne das Auflisten von Verzeichniseinträgen auskommt.

Ebenius
 
Zuletzt bearbeitet:
Hallo,

ganz konkret in diesem Fall habe ich mehrere Verzeichnisse für verschiedene Sets von Icons und Buttons. Ich möchte nun jeweils alle icons eines Verzeichnisses zur Auswahl durch den Anwender anbieten. Sei es nun über eine ComboBox oder über ein Panel wie bei einem ColorChooser usw.

Wenn ich das über ein Array mit Namen Namen realisiere (das funktioniert ja gut), habe ich grundsätzlich zwei Probleme:
1) Ich muss natürlich an jeder verwendeten Stelle erstmal das passende Array anlegen (oder zentral als statische Arrays - jedenfalls für jedes Verzeichnis mind. ein Array)
2) Wenn ich Veränderungen an der Quelle vornehme muss ich an zig Stellen im Code auch nachbessern

Ich finde das nicht wirklich elegant und fehlerträchtig obendrein.

Als workaround habe ich mir überlegt, die entsprechenden Dateien einfach nur mit Nummern zu speichern und dann eine Schleife über Nummern und dann dem Konstrukt "pfad" + NrAlsString + ".png" zu verwenden. Auch nicht wirklich elegant und sprechend sind die Nummern ja auch nicht...

Oder eben ein "echtes" Verzeichnis mit den png-Files anlegen - nur da bin ich ja vor bösen Überraschungen durch Eingriffe des Anwenders nicht gefeit (kann mich z.B. nicht darauf verlassen, dass die Bilder bestimmte Abmessungen haben)
 
Wenn Du irgendwelche Dateien von ner Platte lesen möchtest, dann solltest Du die File-API benutzen. Als Resourcen eines Programmes versteht man aber zur Zeit des Kompilierens bekannte ausgelagerte Programmteile. Darauf ist die Funktionsweise der [c]getRource()[/c]-API auch ausgerichtet.

Ich würde mir eine .properties-Datei oder eine XML-Datei oder eine einfache Liste erzeugen und diese dann wiederum als Resource laden. In der stehen dann alle Icons drin. Die Liste kann man ja im ANT-Script bauen oder über ein shell-Skript erzeugen oder ähnliches. Fänd ich schöner, als die Dateien umzubenennen und dann auf gut Glück alle durchzuladen. Hat außerdem den Vorteil, dass Du nur eine einzige Datei laden musst und nicht hunderte, um zu wissen was es alles gibt.

Ebenius
 
Hallo Ebenius,

vielen Dank für die Hinweise! Das mit den ANT-Scripten und .properties ist derzeit allerdings noch ein paar Stufen zu hoch für meine Java-Kenntnisse. 😉
Ich werde das aber auf jeden Fall als Ansatzpunkt im Hinterkopf behalten!

Nun werde ich das erstmal doch mit dem String-Array mit Dateinamen und getResource() umsetzen - muss halt sehr aufpassen, wenn ich z.B. Icons hinzufüge, auch das Array sauber zu halten.

i.b.fan
 

Zurück
Oben