# Textdatei aus Ressourcen laden.



## pc-freack (17. Jun 2012)

Hallo,

ich würde gerne folgendes machen.
Ich habe ein Packet in meinem Projekt.
In diesem Packet ist eine Textdatei namens "version" und eine weitere 
Datei namens "Application.java".
In der Application.java möchte ich die textdatei auslesen.
Wie kann ich das anstellen.
Ich habe schon einiges gegooglet und auch ein paar dinge gefunden,
doch bis jetzt habe ich es entweder nicht verstanden oder
es hat bei mir einfach nicht funktioniert.

MfG pc-freack


----------



## pc-freack (18. Jun 2012)

Ich hab nun noch etwas gefunden, doch der Code funktioniert nur unter Windows
und leider nicht unter Ubuntu.

Code:


```
public String getVersionFile() { 
        String path = "Files/version.txt"; 
		try {
			URL url = getClass().getClassLoader().getResource(path);
			InputStream data = url.openStream();
			System.out.println("Version-File: " + url.getPath());
	        int c; 
	        StringBuffer buff = new StringBuffer(); 
	        try { 
	            while ((c = data.read()) != -1) { 
	                buff.append((char) c); 
	            } 
	            data.close(); 

	        } catch (IOException e) { 
	            e.printStackTrace(); 
	        } 
	        return buff.toString();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
			
		} 
       
        return "";
    }
```


----------



## SlaterB (18. Jun 2012)

ist das aktuell ein Jar oder Dateisystem? im ersten Fall zu entpacken?
kannst du mit Ubuntu-Tools im Dateisystem nachschauen ob im Dateisystem an richtiger Stelle vorhanden?
was liefert Java-File?

heißt die Datei wirklich version.txt oder unter Ubuntu zufällig nur noch version?
liegt sie parallel zur Java-Klasse wirklich in einem Unterverzeichnis?
wichtiger ist die .class-Datei als die .java-Datei, ist die zufällig woanders? src/bin-Verzeichnisse

in bis zu drei Stufen vorgehen:
a) funktioniert File
b) funktioniert Ressource entpackt, 
c) funktioniert Ressource im Jar, falls nötig?


----------



## pc-freack (18. Jun 2012)

Also es handelt sich hier um eine .jar Datei.
Die version.txt ist in der Java Datei vorhanden unter dem Pfad: "Files/version.txt"
Die Application.class und die version.txt sind im gleichen Pfad, also Ordner.

Unter Windows bekomme ich folgenden Pfad, wenn ich es auslese:


```
file:/C:/Users/pc-freack/Desktop/System%20Analyzer%20-%20Java/System%20A
nalyzer.jar!/Files/version.txt
```

Und das auslesen funktioniert auch unter Windows.
Unter Ubuntu bekomme ich folgenden Pfad zurück:


```
file:/home/pc-freack/System%20Analyzer.jar!/Files/version.txt
```

Doch hier funktioniert es nicht mehr.
Die version.txt hat ihren Namen behalten und ist auch immer noch im gleichen Verzeichnis.
Hat sich also eigentlich mit der Datei nichts geändert. Mit gedit kann ich die Datei auch problemlos öffnen.

Was meinst du den damit, ob die Ressourcen in der Jar funktionieren?


----------



## SlaterB (18. Jun 2012)

> Was meinst du den damit, ob die Ressourcen in der Jar funktionieren? 
na ziemlich genau das was deine Frage ist,

> Die Application.class und die version.txt sind im gleichen Pfad, also Ordner.
wie kann das sein, Application.class befindet sich doch nicht in Files/ oder doch?

wenn ja dann muss das Verzeichnis weggelassen werden, nicht getestet?
die Angabe erfolgt relativ zur Klasse, sonst bräuchte man die Klasse ja nicht wirklich


-----

wie gesagt wäre nett, das Jar erstmal zu entpacken und mit Dateisystem zu arbeiten,
freilich kann es im Dateisystem funktionieren und dann im Jar einfach immer noch nicht,
aber lieber drauf ankommen lassen

entpacken, wo ist Application.class, welches package in Java deklariert, keins?
falls doch, auch passendens Unterverzeichnis vom Grundverzeichnis des Projekts aus?
und darin gibt es ein Verzeichnis Files mit der Textdatei darin?

wird 
new File("evtl. Unverzeichnis der Klassse/Files/version.txt"); usw. gefunden, existiert die Datei? 
geht ein FileReader testweise darauf?

bei File hat man netterweise die Möglichkeit, von wo immer man startet nachzuschauen wo man ist,
alle Unterverzeichnisse/ Dateien aufzulisten usw., das muss ich hoffentlich nicht alles Befehl für Befehl durchgehen

a) funktioniert File?
b) funktioniert Resource entpackt?
c) geht im Moment ja nicht


----------



## pc-freack (18. Jun 2012)

Also die Application.class ist in der Jar im Unterordner Files, genauso wie die version.txt
Wenn ich beim Pfad nur "version.txt" oder "/version.txt" angebe, funktioniert es unter Windows nicht mehr.

Wenn ich es mit new File mache, funktioniert es auch nicht.
Dann findet er die Datei auch nicht.

Unter Windows funktioniert es mit dem Dateisystem.
Auch unter Ubuntu funktioniert es mit dem Dateisystem.


----------



## SlaterB (18. Jun 2012)

> Wenn ich beim Pfad nur "version.txt" oder "/version.txt" angebe, funktioniert es unter Windows nicht mehr.
aber unter Ubuntu schon?

-----

jetzt sehe ich erst wieder die zweite Variante, die irgendwie immer dabei ist:
> getClass().getClassLoader().getResource(path);
bezieht sich auf den ClassLoader, nicht auf die Klasse, 
warum es da den Unterschied gibt kann ich freilich nicht genau sagen,

aber spricht etwas gegen
getClass().getResource(path);
?

das ist meines Erachtens die normalere Varianten, dann wirklich relativ zur Klasse, also "version.txt" oder "/version.txt",
geht das bei beiden oder einen?
wenn nicht kann ich allerdings auch wieder nicht mehr sagen, also ziemlich begrenzt dort 

edit:
nach
Class (Java Platform SE 6)
ist allerdings nicht viel neues zu erwarten..


------

> Wenn ich es mit new File mache, funktioniert es auch nicht.
> Dann findet er die Datei auch nicht.

ich jetzt nicht mehr wichtig, aber da hast du wohl nur einen deiner Pfade unbedarft eingetippt und einmal versucht,
mit File klappt es gerantiert immer, man muss nur das richtige File finden, 

> Unter Windows funktioniert es mit dem Dateisystem.
> Auch unter Ubuntu funktioniert es mit dem Dateisystem.

erstaunlich, besonders dass dann gleichzeitig File nicht hinzubekommen ist


----------



## pc-freack (18. Jun 2012)

Also das mit "version.txt" und "/version.txt" funktioniert bei beiden nicht.

Wenn ich "getClass().getResource(path);" schreibe, dann funktioniert es nicht mehr.

Mit dem File.
Also wenn ich new File deklariere, funktioniert es im Dateisystem, aber nicht, wenn die version.txt
nur in der jar vorhanden ist.
Kann sein, das ich vielleicht etwas nicht richtig verstanden habe.
Naja, ist ja jetzt auch nicht so wichtig, da ich ja beides getestet habe.

EDIT:

Ich hab nun die Application.class ins default package gepackt. Die version.txt
habe ich aber noch so gelassen.
Doch leider funktioniert das immer noch nicht.


----------



## pc-freack (18. Jun 2012)

So, ich habs nun hinbekommen.


----------

