# File aus Projektverzeichnis laden



## moessi91 (31. Mrz 2011)

Wahrscheinlich eine ziemlich einfache Frage aber ich bekomms einfach nicht hin...
Ich möchte gerne in meiner Webapplikation aus einem Propperties File auslesen das ich im Projektverzeichniss speichere. 
Wenn ich jetzt jedoch mit "./" zugreife komme ich ins Server Verzeichnis. Mit "/" komme ich auf "C:\" 
Aber wie komme ich in mein Projektverzeichnis? 

lg


----------



## brauner1990 (31. Mrz 2011)

Du musst dich erstmal von 
	
	
	
	





```
C:
```
 lösen. Du arbeitest am besten immer nur mit relativen Pfaden. Wenn du eine Java WebApp deployst, dann werden auch alle Properties-Files mitdeployt. Du musst dir am besten mal die Struktur des war-File (oder Pendant dazu) angucken. 7Zip oder Winrar sind dafür gut. Die können diese Files händeln.


----------



## moessi91 (31. Mrz 2011)

Ja das ist schon klar... :/ 
Aber wie kann ich mir im Quellcode den Pfad zum Projektverzeichnis holen? 
Das müsste doch irgendwie über die URL gehen oder?


----------



## brauner1990 (31. Mrz 2011)

Arbeitest du mit Servlets? Wenn ja, kann ich dir einen Weg aufzeigen, sonst wirds aber bei niente...


----------



## moessi91 (31. Mrz 2011)

mache alles mit primefaces... :/


----------



## Sym (31. Mrz 2011)

Was möchtest Du denn auslesen? 

Einfache Texte?
Muss es die gesamte Datei an einem Stück sein?


----------



## moessi91 (1. Apr 2011)

Nein ich möchte einfach nur ein Propertiesfile für die Datenbank auslesen.


----------



## JimPanse (1. Apr 2011)

Wo liegt denn die Propertie datei? "Projektverzeichniss!"? Wenn die datei im classpath liegt


```
ResourceBundle bundle = ResourceBundle.getBundle("datei");
```

wenn die datei in einem web-verzeichniss liegt

Bsp:

war.file
-prop/
-jsp/
-web-inf/

dann musst du dir den ServletContext deiner Web-Anwendung holen und:

```
String path = getServletContext().getRealPath( "/prop/datei.properties");
File file = new File(path);
Properties properties = new Properties();
BufferedReader  inputStream = new BufferedReader(new InputStreamReader( new FileInputStream(file), "UTF-8"));
	
		try {
			properties.load(inputStream);
		} finally {
			if (inputStream != null) {
				inputStream.close();
			}
		}
```


----------



## moessi91 (1. Apr 2011)

Also ich habe dabei 2 Fälle:
einmal brauche im in meinem Bean welches einen Upload verwaltet den Projektpfad da dort in einen Ordner die Daten kopiert werden sollen. 
Und im 2. Fall bin ich in meiner Datenbankklasse welche die Klasse dbInfo aufruft welche dann die Properties Datei öffnen soll und ausließt. 
Wie müsste ich das auslesen wenn im im Projektverzeichniss im ersten Fall alles in den ordern /images soll und die properties datei direkt drinnen liegt.


----------



## urlauber (1. Apr 2011)

Smartly load your properties - JavaWorld


----------



## moessi91 (5. Apr 2011)

```
ClassLoader loader = ClassLoader.getSystemClassLoader();
InputStream in = loader.getResourceAsStream("dbInfo.properties");
```

Habe das jetzt mal so gemacht doch habe ich keine ahnung wo das "dbInfo.properties" file liegen muss damit das jetzt geht. 
....
zuzeit ist der inputstream immer "Null"


----------



## jule37 (5. Apr 2011)

für webanwendungen hat sich für mich bewährt den class loader der aktiven klasse zu benutzen um properties zu laden:


```
public class Foo {
    public void loadProperties() {
        Class<?> c = Foo.getClass();
        InputStream in = c.getResourceAsStream("/my.properties");
        Properties properties = new Properties();
        properties.load(in);
        // ...
    }
}
```
Der Vorteil: mit dieser Variante ist man nicht von der Ausführungsumgebung abhängig. Der Ort / ist hier immer das classes Verzeichnis deiner Anwendung. Damit die Properties Datei beim Build von selbst an diesem Ort landet, lege sie z.B. in Eclipse unter src/ ab. Wenn man das war dann in Tomcat deployed liegt das Properties File dann unter $CATALINA_HOME/webapps/Foobar/WEB-INF/classes/


----------



## moessi91 (5. Apr 2011)

Ja perfekt  danke so hat es funktioniert
nur dass man den klassennamen durch this ersetzen muss sonst kommt ein fehler


----------



## moessi91 (5. Apr 2011)

Aber wie kann ich jetzt direkt auf das Verzeichnis kommen? 
Also ich will jetzt zum Beispiel wieder ein File hineinschreiben, ein neues, woher bekomme ich dann das Projektverzeichnis? 
Geht das dann auch über die Klasse?


----------



## jule37 (5. Apr 2011)

nein das geht nicht. das ist nur zum lesen. in diesem fall musst du entweder einen absoluten pfad haben oder den ort von der ausführungsumgebung erhalten. dafür kann ich dir leider ad hoc kein beispiel geben. müsste ich jetzt selber googlen, aber das kannst du auch 

wichtig zum verständnis: so etwas wie projektverzeichnis gibt es bei webapplikationen nicht. der ausführungskontext ist immer der servlet container (z.b. tomcat) und du musst davon ausgehen, dass du sein working directory nicht kennst. vielleicht hilft dir dafür die antwort von JimPanse weiter?



> ```
> String path = getServletContext().getRealPath( "/prop/datei.properties");
> ```



sieht vielversprechend aus


----------



## moessi91 (5. Apr 2011)

hmm....
Naja ich gehe ja von einem Bean aus. Dabei wird eine Datei hochgeladen, welche dann in ein Verzeichnis einen Ordner über dem Klassenverzeichnis soll. Nur hier habe ich keinen Servletcontext bzw. weiß ich nicht woher ich den bekommen soll. Kann man nicht über die Klasse auslesen wo sie liegt?
Das Problem dabei ist, wenn ich dann das Upgeloadete Bild in der index.xhtml anzeigen will dann benutze ich auch relative Pfade, jedoch verweisen die dann in die WebInf im Projektverzeichniss!
lg


----------



## JensMander (5. Apr 2011)

hallo forum, ich hänge mich einfach mal an die frage hier mit ran:

ich habe ein "normales" Tomcat webapps-Verzeichnis unterdem alle meine notwendigen Daten liegen.

Im Ordner "Web-Inf/classes/packageTest/" befindet sich eine Klasse, die eine Datei einliesst,
wenn ich den gesamten Pfad angebe "C:/Tomcat/webapps/anwendung01/dateien/" dann wird die datei auch eingelesen und alles funktioniert. Wenn ich nun aber einfach "../../../dateien/" verwende klappt gar nichts. bedeutet dass auch das ich das auf den vorher beschriebenen weg machen muss, oder habe ich einfach nur etwas anderes falsch gemacht?
mfg
jens


----------

