# Mit getResource() ein ganzes Verzeichnis laden



## Pedda (24. Jul 2006)

Hallo,

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


```
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:


```
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 (24. Jul 2006)

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:

```
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 (24. Jul 2006)

Du könntest auch einen FileFilter verwenden:


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


----------



## WieselAc (14. Feb 2007)

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 
	
	
	
	





```
Test.class.getResource(propsDir);
```

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


```
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


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


----------



## WieselAc (16. Feb 2007)

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 


```
getClass().getClassLoader().getResourceAsStream()
```

und/oder


```
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:


```
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 (16. Feb 2007)

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.


----------

