# Java Properties - Daten auslesen



## Otz (21. Sep 2012)

Hallo

ich versuche gerade mittels Java Properties aus einer config datei bestimmte daten auszulesen. irgendwie klappt das nciht richt 

könnt ihr mir vieleciht weiterhelfen?

hier mein code:

```
private void test()  {
	try{
		Properties p = new Properties();
		FileInputStream stream  = new FileInputStream("sync.properties");
		p.load(stream);
	
		System.out.println(p.getProperty("hostname"));
	}
	catch (IOException e){
		System.out.print("fail");
	}
```

und die config datei:


```
Portnummer 3128
hostname = beispielhost
sprache:de

langerText Dieser Text \
ist länger als eine Zeile
```

so wie ich das verstehe, muss er mir doch jetzt den hostname also beispielhost ausgeben oder?
stattdesen bringt er mir immer nur "fail" also die exception.

wo liegt das problem? 

wo legt man normalerweise diese propertie fieles ab? macht man dafür einen extra ordner oder ein package?
so schauts bei mir:
projekt
1. src
1.1. package(1)
1.1.1. prog 1 welches die propertiy nutzen möchte
1.2propertiy datei


vielen dank


----------



## nillehammer (21. Sep 2012)

```
catch (IOException e){
		System.out.print("fail");
	}
```
Ganz schlechte Idee, Exceptions zu behandeln. In der Exception-Message und dem Stacktrace stecken wertvolle Informationen, was zum Fehler geführt haben könnte. Die verschluckst du komplett. In diesem Fall hätte Dir die Message wahrscheinlich gesagt, dass die Datei nicht gefunden werden konnte.

[EDIT]
Wie Bile Demon richtig bemerkte, stimmten meine Anmerkungen zur Syntax nicht. Habe sie deshalb entfernt
[/EDIT]


----------



## Bile Demon (21. Sep 2012)

Die Syntax für die Properties stimmt schon, das Format ist nämlich recht flexibel.

Wie nillehammer schon anmerkt, wahrscheinlich Datei nicht gefunden oder sowas.

Probier mal sowas wie:


```
p.load(this.getClass().getClassLoader().getResourceAsStream("sync.properties"));
```


----------



## nillehammer (21. Sep 2012)

> wo legt man normalerweise diese propertie fieles ab? macht man dafür einen extra ordner oder ein package?


Kommt drauf an, ob die Properties vom Anwender veränderbar sein sollen:
-Wenn die Properties fix sind, würde ich sie in die Package-Struktur integrieren und auch nicht per File-Semantik sondern mit Class.getResourceAsStream darauf zugreifen. So kann die Datei sogar mit im jar ausgeliefert werden und es gibt keine Probleme beim Laden.

-Wenn die Properties vom Anwender änderbar sein sollen, kommt nur eine Datei in einem Ordner in Frage. Da finde ich es am besten, unter user.home einen Unterordner mit Namen Deines Programms anzulegen und die Datei dort reinzulegen.


----------



## nillehammer (21. Sep 2012)

[OT]





			
				Bile Demon hat gesagt.:
			
		

> Die Syntax für die Properties stimmt schon, das Format ist nämlich recht flexibel.


Tatsache! Doppelpunkte und Leerzeichen sind als Key-Value-Trenner erlaubt! Wusste ich tatsächlich nicht.[/OT]


----------



## Otz (21. Sep 2012)

ich denke auch, dass die syntax stimmen müsste.
habe ich nämlich copy/paste aus nem online tut rauskopiert 

Das mit der Exception war wirklich nicht klug. habs jetzt mal ausgegeben:

java.io.FileNotFoundException: sync.properties (Das System kann die angegebene Datei nicht finden)

nach der änderung von Bile Demon funktioniert es jetzt wie gewünscht 

aber warum funktionioert es mit ("sync.properties") nicht?


----------



## Gast2 (21. Sep 2012)

Weil er bei deiner Methode relativ zum working directory sucht, im anderen Fall sucht er relativ zur Klasse.


----------



## nillehammer (21. Sep 2012)

> aber warum funktionioert es mit ("sync.properties") nicht?


Weil er mit dieser Pfadangabe die Datei nicht -wie wahrscheinlich gewünscht- im Ordner des Default-Packages sucht, sondern im aktuellen Ordner, von dem aus das Programm gestartet wurde. Wenn Du folgenden Code in Dein Programm einbaust, kannst Du Dir mal anzeigen lassen, welcher Ordner das ist:

```
// gibt den absoluten Pfad des aktuellen Ordners aus
System.out.println(new File("").getAbsolutePath());
```


----------



## Otz (21. Sep 2012)

nillehammer hat gesagt.:


> Weil er mit dieser Pfadangabe die Datei nicht -wie wahrscheinlich gewünscht- im Ordner des Default-Packages sucht, sondern im aktuellen Ordner, von dem aus das Programm gestartet wurde. Wenn Du folgenden Code in Dein Programm einbaust, kannst Du Dir mal anzeigen lassen, welcher Ordner das ist:
> 
> ```
> // gibt den absoluten Pfad des aktuellen Ordners aus
> ...



genau das dachte ich mir auch schon, dass der irgendwo an der "falschen" Stelle sucht. wusste nur nicht wo.

das zeigt es mir aber jetzt an. vielen dank für die codezeile sehr nützlich


----------



## jamesv (21. Sep 2012)

Cool, ihr habt mir auch geholfen. Dankeschön


----------



## Otz (24. Sep 2012)

ich hab da mal noch ne Frage:

und zwar ich habe ein properties file in das mehrere Daten gleicher Objekte eingetragen werden.
Z.B. ich habe 5 server

Server1 name
Server1 adresse

Server2 name
....

Diese Daten lese ich jetzt aus und zeige sie in einer Tabelle an.


Wie kann ich dies jetzt aber dynamisch machen? also wenn ich nicht weiß dass es 5 Server sind?
Muss ich im prop file eine Variable Anlegen in der die Anzahl gespeichert ist und auf diese dann zugreifen?


----------



## nillehammer (24. Sep 2012)

> Muss ich im prop file eine Variable Anlegen in der die Anzahl gespeichert ist und auf diese dann zugreifen?


Das ist ein gangbarer Weg. Habe selbst properties-Dateien benutzt, wo das so gemacht wurde. Eine andere Idee, wäre, einfach solange selbst hochzuzählen, bis die getProperty-Methode null zurück liefert. Wenn Du also in einer Schleife bei server5 null zurück bekommst, weißt Du, dass server1 bis server4 eingetragen waren.


----------



## Otz (26. Sep 2012)

ok, ich habe es jetzt mit der schleife gemacht...

ich habe aber jetzt nochmal ne frage zum thema properties 

und zwar jetzt kann ich aus einer datei lesen, wie kann ich in sie schreiben?

bis jetzt habe ich dies hier aus einem tut im netz. 

[Java] try {
    		//set the properties value
    		prop.setProperty("database", "localhost");
    		prop.setProperty("dbuser", "mkyong");
    		prop.setProperty("dbpassword", "password");

    		//save properties to project root folder
    		prop.store(new FileOutputStream("config.properties"), null);

    	} catch (IOException ex) {
    		ex.printStackTrace();
        }
[/Java]


verändert sich beim schreiben die .prop datei nur temporär oder wird "wirklich" etwas in das file geschrieben?
Denn wenn ich nach der ausführung die properties datei öffne hat sich da nichts geändert. aber wenn ichs mit ausgeben lasse ändert sich der wert auf den neuen übergebenen


----------



## nillehammer (26. Sep 2012)

> verändert sich beim schreiben die .prop datei nur temporär oder wird "wirklich" etwas in das file geschrieben?


[JAVA=2]
//set the properties value
prop.setProperty("database", "localhost");
prop.setProperty("dbuser", "mkyong");
prop.setProperty("dbpassword", "password");
[/code]
Dieser Code verändert nur die Werte des Properties-Objekts. Das ist alles im RAM. Es wird nicht auf die Platte geschrieben. Deswegen sollte der Teil des Codes auch nicht in den try-catch-Block rein.
[JAVA=7]
//save properties to project root folder
prop.store(new FileOutputStream("config.properties"), null);
[/code]
Diese Zeile erstellt einen OutputStream und schreibt die Werte des Properties-Objekts da rein. Es ist ein FileOutputStream, also landet das in einer Datei. Hier kann eine Exception fliegen. Der Teil gehört darum in den try-catch-Block.


----------

