# getResourceAsStream immer null



## meisterlampe (18. Jan 2007)

Habe ein fettes Problem:

Folgender Code funzt in Eclipse wunderbar:

```
package test.files.;

import java.net.URL;

public class FontTest
{

	public static void main(String[] args)
	{
	    System.out.println(FontTest.class.getClassLoader().getResourceAsStream("test/files/"));
	}

}
```

Ausgabe in Eclipse:
java.io.ByteArrayInputStream@dbe178

Funzt also!


Gepackt zum test.jar:

java -cp "test.jar" test.files.FontTest

Ausgabe: null


Wieso ist das so? Es ist doch im Classpath? Falscher Classloader??


----------



## meisterlampe (18. Jan 2007)

Folgendes geht auch nicht:

```
System.out.println(Thread.currentThread().getContextClassLoader().getResourceAsStream("test/files/"));
System.out.println(FontTest.class.getClassLoader().getResourceAsStream("test/files/"));
System.out.println(FontTest.class.getResourceAsStream("/test/files/"));
System.out.println(ClassLoader.getSystemResourceAsStream("test/files/"));
```

Eclipse:
java.io.ByteArrayInputStream@dbe178
java.io.ByteArrayInputStream@1af9e22
java.io.ByteArrayInputStream@b6ece5
java.io.ByteArrayInputStream@17ace8d

Funzt also!

mit java -cp "test.jar" test.files.FontTest: 
null
null
null
null

Irgendwie geht garnix!!


----------



## meisterlampe (18. Jan 2007)

Java macht mich wahnsinnig  bin immer noch nicht auf eine Lösung gekommen!
Ich möchte in einem Programm auf die Art prüfen ob das Verzeichnis existiert und ggf. Dateien daraus laden. :x


----------



## meisterlampe (18. Jan 2007)

Problem gelöst!
Übrigens funktioniert das obige Beispiel in beiden fällen, dachte es für euch möglichst nachvollziehbar machen zu müssen und dann wars so simple das es funktionierte.

Mein echtes Beispiel funktionierte in einem anderen Zusammenhang nicht, aber egal.

Die Punkte für die oft angesprochenen Probleme bezgl. des Lesens von Dateien aus Jars sind 2 Dinge.

1. jar fehlt im classpath
2. jar ist im classpath nur die SICHTBARKEIT ist falsch

Ein Beispiel: 
Klassen die sich im im Package "/test/files" befinden, können nur von dort 
und natürlich aus den Unterverzeichnissen heraus "hier: /files" ihre Resourcen laden, wegen der Sichtbarkeit.

Deswegen bekam ich in meinem eigenen Beispiel bei getResourceAsStream() null zurück, da die Resource sich nicht in der Sichtbarkeit der Klasse befand.

Es gibt ja auch neben private, public, protected noch package!

Wenn ich nun beispielsweise getClass().getResource() verwende funktioniert das in den wenigsten Fällen, da von der Klasse Object aus gegangen wird, und so Resourcen im Package nicht gefunden werden.

Benutze ich nun this.getClass().getResource() funktioniert das schön eher, da nun eine Konkrete Klasse gefunden wird z.B. FontTest im Package /test/files/ aus der heraus eben das "this.getClass().getResource()" aufgerufen wird.


----------



## meisterlampe (19. Jan 2007)

Hi ich bins nochmal.
Den obigenText bitte vergessen. Dachte gestern in geistiger Umnachtung die Lösung gefunden zu haben.

Folgendes wars aber wirklich, hab ich nach langer Suche im Netz gefunden:

I found the problem. I had exported the jar from Eclipse but hadn't 
checked the "Add directory entries" checkbox. The way ResolverUtil works 
now is to translate the package to a directory then ask the ClassLoader 
for the directory. If a separate directory entry doesn't exist in the 
jar the ClassLoader will return an empty Enumeration. 

It looks like it could be a bug in 
	
	
	
	





```
ClassLoader.getResources()
```
. 

This behavior probably needs to be documented somewhere so others don't 
get bitten by it.

Aaron


----------

