# Konfigurationsdatei einlesen



## jarobi (26. Aug 2010)

Guten Tag ,
ich möchte werte aus einer Konfigurationsdatei einlesen. Jetzt ist mein Problem dass er die Datei in meinem Workspace nicht findet

Code:


```
Properties properties = new Properties();
String propFileName = "XXX.properties";
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("propFileName");

      if (inputStream == null) {
          throw new FileNotFoundException("property file '" + propFileName
              + "' not found in the classpath");
      }

      properties.load(inputStream);
```

Mein Workspace ist  so aufgebaut:

* Projekt
**   src
**   base

Im "base" ordner ist ein weitere Ordner config( /base/config) und in dieser ist die Konfigurationsdatei.

Habs mal mit dem direkten Pfad versucht hab mal am Classpath rumprobiert. Kann es sein das ich im Classpath einen bestimmten Eintrag setzen muss?

Mfg 
jarobi


----------



## bygones (26. Aug 2010)

du musst aber dann auch /base/config/propFileName laden und nicht nur propFileName


----------



## jarobi (26. Aug 2010)

Ja das hab ich auch gemacht . Trotzdem kommt egal was ich probiere dieselbe Exception.

"java.io.FileNotFoundException: property file 'thesaurus.properties' not found in the classpath"


----------



## VfL_Freak (26. Aug 2010)

ist der Pfad denn auch korrekt im classpath eingetragen ??? :L

Gruß
Klaus


----------



## jarobi (26. Aug 2010)

ja das hatte ich ja gemeint. Wie müsste so ein eventueller Classpath Eintrag aussehen?


----------



## VfL_Freak (26. Aug 2010)

Moin,

das hängt u. U. davon ab, mit welcher Umgebung Du arbeitest.

Ich habe hier den Borland JBuilder, da gibt es dann die Manifestdatei <ProjektName>.mf 
Hier ist der Classpath eingetragen

```
Main-Class: <ProjektName>.mainApp
Class-Path: log4j-1.2.8.jar jco.jar win32com.jar jspComm.jar Serialio.jar edtftpj.jar foxtrot-core-3.0.jar swingx-1.6.jar
```

Es sollte bspw. bei Eclpise auch irgendwo in den Projekteinstellungen zugreifbar sein ...

Vlt. hilft Dir das weiter!

Gruß
Klaus


----------



## maki (26. Aug 2010)

Lesenswert: Smartly load your properties - JavaWorld

Vorrausgesetzt die Unterornder von base sind im Classpath, dann geht das.


----------



## jarobi (26. Aug 2010)

Es ist eine Eclipse Umgebung mit der ich eine Webanwendung baue.

Ich tippe ganz schwer das das Problem am Classpath liegt. Ich weiss halt nicht wie genau der Eintrag im Classpath lauten muss. Der Java Code an sich ist ja kein Problem, aber was genau muss ich in den Classpath eintragen? Mir ist klar das ich den Pfad zum ordner eintragen muss, nur wie schreibt man das syntaktisch richtig in den Classpath rein?


----------



## xjCoder (26. Aug 2010)

Hi,

jetzt habe ich auch noch eine Frage dazu:



jarobi hat gesagt.:


> Code:
> 
> 
> ```
> ...



Wenn ich das richtig verstehe, müsste Dein Pfad also so 
	
	
	
	





```
String propFileName = "./base/config/XXX.properties";
```
 aussehen...

Wenn dem so ist, dann müsste ein 
	
	
	
	





```
System.out.println(new File(propFileName).exists());
```
 doch *true* ergeben?!

Und wenn Du den InputStream mit 
	
	
	
	





```
InputStream inputStream = new FileInputStream(new File(propFileName));
```
 erzeugst, 
dann dürfte etwas anderes als _null _herauskommen ...

Falls ich jetzt völlig daneben liege, bitte ich um eine 'milde Strafe'


----------



## jarobi (26. Aug 2010)

Er gibt mir False, also findet die datei nicht.


----------



## xjCoder (26. Aug 2010)

...also ich habe mir ein Testprojekt unter eclipse angelegt und es funktioniert ausgezeichnet.
Im Verzeichnis des Projekts existieren folgende Verzeichnisse/Dateien:


bin/PropertyFileLoadTest.class
src/PropertyFileLoadTest.java
base/config/XXX.properties

Dementsprechend ist der Pfad zur Properties-Datei *./base/config/XXX.properties*
Wichtig ist der Punkt als erster Wert der Pfadeingabe.


```
String propFileName = "./base/config/XXX.properties";
System.out.println(new File(propFileName).exists());
```


----------



## bygones (26. Aug 2010)

Xeter hat gesagt.:


> ```
> String propFileName = "./base/config/XXX.properties";
> System.out.println(new File(propFileName).exists());
> ```


das ist zu gefährlich... das klappt zb dann in eclipse, doch wenn das ganze als war bzw jar irgendwo liegt ist das nicht garantiert... daher resourcen am besten immer ueber getResources... holen


----------



## xjCoder (26. Aug 2010)

bygones hat gesagt.:


> das ist zu gefährlich... das klappt zb dann in eclipse, doch wenn das ganze als war bzw jar irgendwo liegt ist das nicht garantiert... daher resourcen am besten immer ueber getResources... holen



Einverstanden, aber so weit ist es ja glaube ich noch nicht ...

Und da der Pfad irgendwie noch nicht zu passen scheint



jarobi hat gesagt.:


> Er gibt mir False, also findet die datei nicht.



wäre dies zumindest mal einen Test wert, oder?


----------



## jarobi (26. Aug 2010)

> das ist zu gefährlich... das klappt zb dann in eclipse, doch wenn das ganze als war bzw jar irgendwo liegt ist das nicht garantiert... daher resourcen am besten immer ueber getResources... holen


Ja aus dem Grund nutze ich getResourceAsStream


Trotzdem funktioniert es ja bei dir, bei mir aber nicht. Da ich millionemal drübergeschaut habe kann ich auch irgendwelche Rechtschreibfehler oder falsche Ordnerstrukturen ausschliessen.


----------



## jarobi (26. Aug 2010)

So mittlerweile funktioniert es, aber auch nur wenn ich die Datei in den bin-Ordner stecke und den Pfad dann entsprechen so angebe ("./XXX.properties").
Der bin Ordner ist anscheinend mein Root Verzeichnis. Deshalb hat er auch mein base verzeichniss nicht gefunden da er auf der gleichen Ebene wie mein Bin Ordner liegt  
-->





> ./base/config/XXX.properties


 -> konnte ja nicht funktionieren da der "base-Ordner" sich auf der gleichen Ebene befindet und nicht eine Stufe unterm "bin-Ordner".

Wie muss den die Pfadangabe lauten damit ich vom Bin Ordner zu dem auf gleicher Ebene liegenden base Ordner gelange??


----------



## mvitz (26. Aug 2010)

Du solltest den Ordner base/config zum Source-Folder machen. (In Eclipse rechtsklick drauf und dann Source-->Add to build path). Danach funktioniert auch der Aufruf

```
this.getClass().getClassLoader().getResourceAsStream("propFileName");
```


----------



## jarobi (27. Aug 2010)

mvitz hat gesagt.:


> Du solltest den Ordner base/config zum Source-Folder machen. (In Eclipse rechtsklick drauf und dann Source-->Add to build path). Danach funktioniert auch der Aufruf
> 
> ```
> this.getClass().getClassLoader().getResourceAsStream("propFileName");
> ```



Das ist ein projekt auf der Arbeit, ich kann da nicht einfach die Ordnerstruktur oder den Source Folder wechseln.
Das ganze müsste doch durch einen bestimmten Classpath Eintrag zu schaffen sein?


----------



## mvitz (27. Aug 2010)

Klar müsste das. Deswegen macht man den Ordner ja zum Source-Folder, damit dieser von Eclipse automatisch mit nach /bin genommen wird (und alles was in /bin ist, ist bei Eclipse der Classpath). Direkt nach /bin kopieren darf man nicht, da Eclipse den Ordner z.B. beim Cleanen eines Projektes löscht.


----------



## jarobi (27. Aug 2010)

ok mal was anderes:

per FileInputStreamm würde das ohne Probleme funktionieren:


```
String propFileName = "./conf/XXX.properties"; 
BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(propFileName));
```

Da das ein relativer Pfad ist würde es doch auch ausserhalb meines Eclipse Project funktionieren, also verpackt als WAR irgendwo anderst nutzbar.....oder???


----------



## mvitz (27. Aug 2010)

Nein.

Wenn deine Konfiguration z.B. in einem JAR ist, dann kann man darauf so nicht zugreifen. Ähnliches für ein WAR. Ein ApplicationServer muss das WAR nicht entpacken. Zudem geht dein Pfad so vom aktuellen Ausführungsverzeichnis aus los. Wenn du etwas selber über die Konsole startest, dann weißt du natürlich welches Verzeichnis das ist, aber welches Verzeichnis dein ApplicationServer nutzt, weißt du nun mal nicht.

Aus diesem Grunde wenn man nur lesen möchte immer den Classpath nutzen.


----------



## maki (27. Aug 2010)

Ich zitiere mich mal selber:


maki hat gesagt.:


> Lesenswert: Smartly load your properties - JavaWorld
> 
> ...


Da steht eigentlich alles drinnen + Code für eine Utilityklasse die das Problem löst.


----------



## Vayu (27. Aug 2010)

davon ab, dass man schon die variable mit dem dateinamen übergeben sollte und nicht den variablennamen als String 


```
this.getClass().getClassLoader().getResourceAsStream("propFileName");
```

vs.


```
this.getClass().getClassLoader().getResourceAsStream(propFileName);
```


----------

