Mit getResource() ein ganzes Verzeichnis laden

Status
Nicht offen für weitere Antworten.

Pedda

Mitglied
Hallo,

ich habe ein Verzeichnis voll mit Grafiken, die ich bisher wie folgt in eine HashMap geladen habe:

Code:
public static void init(){
String imagesDir = "graphics/";
File cwd = new File(imagesDir);
File files[] = cwd.listFiles();
        for (File file : files) {
                if(file.getName().endsWith(".gif")){
                        try {
                                BufferedImage img = ImageIO.read(file);
                                String name = file.getName().replaceAll(".gif","");
                                imageHeap.put(name, img);
                        } catch (Exception e) {
    			JOptionPane.showMessageDialog(null, "Unkown Error during loading the images.\n"
    					+ "Problem with " + file, "Error", JOptionPane.ERROR_MESSAGE);
                }
        }
}

Nun wollte ich mein Programm einem Grafiker als jar zukommen lassen.
Innerhalb einer jar ist das Laden der Dateien wie oben natürlich auf Grund des veränderten Pfades, nicht möglich.
Ich weiß das man mit classname.class.getResource(...) innerhalb eines statischen Kontext bzw. außerhalb auch mit getClass().getResource(...) auf Dateien wunderbar zugreifen kann (auch wenn es sich nicht um eine jar handelt).

Nun habe ich folgendes versucht:

Code:
public static void init(){
String imagesDir = "graphics/";
URL url = Images.class.getResource(imagesDir);
System.out.println(url);
try { imagesDir=URLDecoder.decode(url.getFile(),"UTF-8"); }
catch (UnsupportedEncodingException e1) {}
File cwd = new File(imagesDir);
File files[] = cwd.listFiles();
        for (File file : files) {
                if(file.getName().endsWith(".gif")){
                        try {
                                BufferedImage img = ImageIO.read(file);
                                String name = file.getName().replaceAll(".gif","");
                                imageHeap.put(name, img);
                        } catch (Exception e) {
    			JOptionPane.showMessageDialog(null, "Unkown Error during loading the images.\n"
    					+ "Problem with " + file, "Error", JOptionPane.ERROR_MESSAGE);
                }
        }
}

Das funktioniert leider innerhalb einer jar nicht. url ist null, das Verzeichnis wird also nicht gefunden. Wenn ich stattdessen "graphics/bsp.gif" versuche, also eine einzelne Datei im Verzeichnis direkt anspreche geht es, sprich er findet die Datei im Verzeichnis aber nicht das Verzeichnis selber.

Ich hoffe hier kann mir jemand helfen, google konnte es leider nicht.
 

Pedda

Mitglied
Zweieinhalb Stunden später hab ich die Lösung und bin ein Stück schlauer geworden.

Das Problem: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4761949

Meine Lösung:
Code:
public static void init() throws Exception {
		String imagesDir = "graphics/";
		String fileName = "";
		URL url = Images.class.getResource(imagesDir);
		fileName = URLDecoder.decode(url.getFile(), "UTF-8");
		File cwd = new File(fileName);
		if (!cwd.isDirectory()) {
			int index = fileName.lastIndexOf(".jar") + 4;
			String pathtoJar = fileName.substring(5, index);
			JarFile jf = new JarFile(pathtoJar);
			Enumeration<JarEntry> je = jf.entries();
			while (je.hasMoreElements()) {
				String jename = je.nextElement().getName();
				if (jename.startsWith("storage/graphics/")
						&& jename.endsWith(".gif")) {
					BufferedImage img = ImageIO.read(jf.getInputStream(jf
							.getJarEntry(jename)));
					String name = jename.replaceAll("storage/graphics/", "");
					name = name.replaceAll(".gif", "");
					imageHeap.put(name, img);
				}
			}
		} else {
			File files[] = cwd.listFiles();
			for (File file : files) {
				if (file.getName().endsWith(".gif")) {
					BufferedImage img = ImageIO.read(file);
					String name = file.getName().replaceAll(".gif", "");
					imageHeap.put(name, img);
				}
			}
		}
	}

Oder hat jemand eine bessere Idee parat?
 

foobar

Top Contributor
Du könntest auch einen FileFilter verwenden:

Code:
File[] f = file.listFiles(new FileFilter()
            {
                public boolean accept(File pathname) 
                {
                    return (pathname.getName().endsWith("*.gif"));
                }
            });
 

WieselAc

Top Contributor
Hallo,

ich muss diesen Thread nochmal rausgraben, weil ich auf der Suche nach genau sowas bin. Bei mir klappt das nicht ich bekomme immer ein null Objekt aus diesem Aufruf zurück
Code:
Test.class.getResource(propsDir);

Mein kleines Beispiel sieht wie foglt aus (ist eigentlich das obige)

Code:
package test;

import java.io.File;
import java.io.FileFilter;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLDecoder;

public class Test {

	public static void main(String[] args) {

		try {
			String propsDir= "props/";
			URL url = Test.class.getResource(propsDir);
			String fileName = URLDecoder.decode(url.getFile(), "UTF-8");
			File cwd = new File(fileName);
			File[] f = cwd.listFiles(new FileFilter() {
				public boolean accept(File pathname) {
					return (pathname.getName().endsWith(".properties"));
				}
			});
			for (int i = 0; i < f.length; i++) {
				System.out.println(f[i].getName());
			}
		} catch (UnsupportedEncodingException e) {

			e.printStackTrace();
		}
	}
}

die Dateistruktur

Code:
----- Projekt-Folder 
                     ----- src
                               ----- props
                                     -------- lang1.properties
                                     -------- lang2.properties
                                     -------- lang3.properties
                               ----- test
                                     ------- Test.java
 

WieselAc

Top Contributor
das Problem besteht leider immer noch. Da bis jetzt Keiner helfen konnte, hier noch etwas zur Erläuterung, vielleicht hilft es ja weiter:

Zur Zeit versuche ich ein Programm, das an sich wunderbar läuft, als jar lauffähig zu bekommen. Dazu hab ich schon benötigte Bilder und Konfigurations-Dateien über

Code:
 getClass().getClassLoader().getResourceAsStream()

und/oder

Code:
  Test.class.getClassLoader().getResourceAsStream()

eingebunden.

Jetzt müsste ich aber auch Dateien dynamisch einlesen können. Soll konkret heißen in hab ein meinem jar einen Ordner mit einer Reihe Properties-Files, die Sprache Konfigurationsdateien dienen sollen. Jetzt bin ich auf der Suche alle Dateien in dem speziellen Ordner auszulesen. mein Ansatz dazu war/ist:

Code:
URL url = getClass().getClassLoader().getResource("lang/");

Das funktioniert auch wie gedacht, allerdings nur solange, bis ich das Programm als jar exportiere. Dann bekomm ich nicht mehr die URL sondern null zurück. Weiß jemand wie ich das Problem lösen kann?
 

WieselAc

Top Contributor
Tja war mein Fehler. Wenn schon ein "BUG-Report" gemacht wurde, dann sollte man den auch gründlich lesen.

Kurz und knapp: Man muss nur die Option "Add directory entries" beim erzeugen des jars setzen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K getResource guckt im Target-Ordner...? Allgemeine Java-Themen 2
T Seltsamer CaseSensitive Effekt bei getResource Allgemeine Java-Themen 1
Neumi5694 Methoden getResource() aus Jar Allgemeine Java-Themen 4
Slevin getResource & relative Pfade Allgemeine Java-Themen 1
M File in JAR getResource().getFile() Allgemeine Java-Themen 2
A getResource() Allgemeine Java-Themen 7
mongole Class.class.getResource(...) Allgemeine Java-Themen 10
G Pfadangabe mit getResource Allgemeine Java-Themen 7
C Problem mit Class.getResource() in einer Jar-Datei Allgemeine Java-Themen 4
S Ganzes Programm "stucked" - JVM-Fehler? Allgemeine Java-Themen 2
S auf nächstes Ganzes runden Allgemeine Java-Themen 5
J Swing Frame schließt ganzes Programm(Jasperreport) Allgemeine Java-Themen 6
E try/catch Block um ganzes Programm Allgemeine Java-Themen 10
7 Gibts in Java ne Funktion, die ein ganzes Array ausgibt Allgemeine Java-Themen 11
S Verzeichnis schreibzugriffe erlaubt unabhängig von ACL und Posix Allgemeine Java-Themen 11
T Geeignetes Verzeichnis Allgemeine Java-Themen 5
P Wofür ist das Verzeichnis $HOME/.oracle_jre_usage? Allgemeine Java-Themen 3
M Dateien aus einem Verzeichnis auf einem Server auflisten Allgemeine Java-Themen 5
K NetBeans Ordner bei 'Clean&Build' automatisch in dist Verzeichnis kopieren Allgemeine Java-Themen 0
C Verzeichnis ins JMenu einlesen Allgemeine Java-Themen 2
A Class Datei aus Verzeichnis über URLClassLoader laden Allgemeine Java-Themen 2
C Umgebungsvariable Java-Datei in anderem Verzeichnis ausführen Allgemeine Java-Themen 2
K [Refactoring] ClassLoader Verzeichnis durchsuchen lassen Allgemeine Java-Themen 7
R Welches User-Verzeichnis wählen für Configurationsdateien - Windows Allgemeine Java-Themen 2
R Änderungen in einem Verzeichnis beobachten - Windows Allgemeine Java-Themen 3
S Aus executable jar Verzeichnis erstellen Allgemeine Java-Themen 8
reibi Leeres Verzeichnis in ein Zipfile einfügen Allgemeine Java-Themen 12
reibi Schreibrechte auf ein Verzeichnis Allgemeine Java-Themen 3
G Log4J Verzeichnis der Log-Datei konfigurieren Allgemeine Java-Themen 8
A Drucken ändert aktuelles Verzeichnis Allgemeine Java-Themen 2
reibi Aktuelles Verzeichnis in den Klassenpfad nehmen Allgemeine Java-Themen 9
T Eclipse Dateien einzeln aus einem Verzeichnis laden! Allgemeine Java-Themen 6
B ObjectOutputStream verzeichnis wählen Allgemeine Java-Themen 8
Benji0815 Verzeichnis wie im Windows Explorer in einem JTree anzeigen Allgemeine Java-Themen 6
L Applet Verzeichnis lesen Allgemeine Java-Themen 3
B Verzeichnis durchsuchen geschwindigkeit optimieren Allgemeine Java-Themen 6
B in welchem verzeichnis liegen alle installierten klassen? Allgemeine Java-Themen 6
G Klassen aus Verzeichnis laden Allgemeine Java-Themen 13
S Aktuelles Verzeichnis - CMD/Kommandozeilenproblem Allgemeine Java-Themen 9
G Zwischen Datei und Verzeichnis unterscheiden. Allgemeine Java-Themen 11
C Velocity liest template-Dateien nicht aus einem Verzeichnis Allgemeine Java-Themen 3
heart_disease Verzeichnis-Probleme mit ZIP Allgemeine Java-Themen 4
M Verzeichnis durchlaufen und Dateien umbennen Allgemeine Java-Themen 2
P Verzeichnis in JAR-Datei durchgehen Allgemeine Java-Themen 2
G Dateien und Verzeichnisse in einem Verzeichnis zählen Allgemeine Java-Themen 9
W Verzeichnis für Benutzerfiles Allgemeine Java-Themen 7
S Ist File ein root-Verzeichnis? Allgemeine Java-Themen 2
J Herangehensweise: FTP-Transfer von Verzeichnis Allgemeine Java-Themen 8
G Java Klasse in einem anderen Verzeichnis aufrufen Allgemeine Java-Themen 3
H mit javac Verzeichnis kompilieren Allgemeine Java-Themen 2
E Existierendes Verzeichnis nicht gefunden Allgemeine Java-Themen 4
M Verzeichnis auslesen - Fehler in isDirectory()? Allgemeine Java-Themen 4
F Verzeichnis, in dem sich die ausführende jar Datei befindet Allgemeine Java-Themen 9
K Verzeichnis rekursiv aus JAR-Datei extrahieren Allgemeine Java-Themen 6
O Ein Verzeichnis aus der Root ablesen/Dateitypen registrieren Allgemeine Java-Themen 5
P Verzeichnis auwählen Allgemeine Java-Themen 2
S Starten einer Anwendung von einem anderen Verzeichnis Allgemeine Java-Themen 3
T Verzeichnis der Klasse Allgemeine Java-Themen 7
J Verzeichnis aus meinem JAR auslesen und abspeichern. Allgemeine Java-Themen 2
G Verzeichnis löschen? Allgemeine Java-Themen 3
W Aktuelles Verzeichnis rausfinden Allgemeine Java-Themen 13
S Probleme mit dem Compilieren von Dateien in Verzeichnis Allgemeine Java-Themen 4
G Dateien zählen im Verzeichnis Allgemeine Java-Themen 11
G aktuelles Verzeichnis Allgemeine Java-Themen 2
A Verzeichnis auflisten - auch innerhalb eines Jars Allgemeine Java-Themen 6
G Verzeichnis überwachen Allgemeine Java-Themen 13
S Temporäres Verzeichnis anlegen? Allgemeine Java-Themen 4
G Java Runtime Verzeichnis ermitteln Allgemeine Java-Themen 3
S dringend-verzeichnis von festplatte einlesen Allgemeine Java-Themen 9
P Dateinamen testen? Schreibrechte auf Verzeichnis testen? Allgemeine Java-Themen 8
M Verzeichnis verschieben? Allgemeine Java-Themen 2
G Bestimmte Dateien aus Verzeichnis löschen Allgemeine Java-Themen 5
S Programm starten mit Runtime aktuelles Verzeichnis wechseln Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben