# Datei über das Netzwerk einlesen und speichern



## userSeb (3. Aug 2011)

Hallo, wie die Überschrift schon andeutet, will ich eine Textdatei, die auf einem freigegebenen Ordner liegt einlesen. Die Textdatei liegt auf einem Windows XP-System. Das Java Programm läuft unter MacOS. 

Hier ist mein Codeausschnitt:


```
String path = \\\\192.168.0.2\\VRML\\; //"VRML" ist Ordner mit Freigabe 
String partToOpen = test;
String part = testParameter1Parameter2;

File file = new File(path + part + ".wrl");
  if (!file.exists()){
    System.out.println("file does not exist"); 
    try {
      BufferedReader in = new BufferedReader(new FileReader(path + partToOpen + ".wrl"));
				
      BufferedWriter out = new BufferedWriter(new FileWriter(path + part + ".wrl"));
			
      String str;
      while ((str = in.readLine()) != null) {
        
        //hier steht noch eine if-Bedingung, die str noch um Strings erweitert
	
        out.write(str); 
        out.newLine();
      }
      in.close();
      out.close();
    } 
    catch (IOException e) {
      e.getStackTrace();
      System.out.println(e);
    }
}
```

Es soll also der Inhalt einer Textdatei eingelesen, und deren Inhalt plus Erweiterungen in einer neuen Textdatei gespeichert werden. Ganz zu Anfang wird geprüft, ob es die zu erstellende Datei schon gibt...

Ich bekomme aber immer ein FileNotFoundException.

Was mache ich falsch? Wäre über jeden Denkanstoß dankbar.


----------



## dayaftereh (3. Aug 2011)

Hey... du nutzt eine SAMBA-Server um die Datein im Netzwerk frei zu geben? dann schau mal hier:
https://rz-static.uni-hohenheim.de/...el_12_014.htm#Rxx365java12014040004041F03D100


----------



## userSeb (3. Aug 2011)

hallo, ehrlich gesagt, weiß ich es nicht.
wenn ich aber "smb://192.168.0.2/VRML" in mein Browser eingebe, wird mir der Inhalt angezeigt.

das Bsp. unter dem Link habe ich im meinem Anwendungsfall auch nicht zum laufen gebracht....


----------



## dayaftereh (3. Aug 2011)

Kommt immer noch die FileNotFound Excpetion?


----------



## nillehammer (3. Aug 2011)

FileReader sind für den Zugriff auf Dateien im lokalen Dateisystem gedacht. Die Resource befindet sich aber nicht im lokalen Dateisystem (Du kannst z.B. mit dem cd-Befehl auf der Kommandozeile nicht in ein Verzeichnis wechseln, wo die Datei drinnen wäre). Deswegen kriegst Du eine FileNotFoundException.

Zwei Lösungsmöglichkeiten gibt es:
1.) Du mountest den freigegebenen Ordner in ein Verzeichnis Deines MacOS. Dann wird er Bestandteil des lokalen Dateisystems (cd klappt dann z.B. auch). Damit kannst Du dann in Java mit FileReadern arbeiten. Ist aus Sicht des Programmierers sicher die einfachere Variante.

2.) Du behandelst die Datei als das, was sie ist, nämlich eine Resource im Netzwerk, auf die man über eine URL zugreifen kann. Zur URL (\\\\192.168.0.2\\VRML\\) noch ein Hinweis: Ich glaube nicht, dass sie gültig ist. Es fehlt die Angabe des Protokolls und die Backslashes müssen Frowardslashes sein (dann natürlich nur einfach). Eine gültige URL müsste so aussehen (smb://192.168.0.2/VRML/)

Gruß nillehammer


----------



## userSeb (4. Aug 2011)

@dayaftereh: nein, so funktioniert es erst einmal

@nillehammer: hatte beide Varianten im Visier gehabt. War aber leider zu blöd, diese umzusetzen. 

Danke euch erstmal!


----------



## userSeb (4. Aug 2011)

@ nillehammer nochmal:

wenn ich 


```
URL path = new URL("smb://192.168.0.2/VRML/" + partToOpen + ".wrl");
```

und dann 


```
File file = new File(path);
```

bekomme ich eine Exception, weil "smb:/192.168.0.2/VRML/test.wrl" nicht gefunden wird. Es werden also die slashs umgwandelt/ersetzt. Wie kann ich das umgehen, bzw. hat es was damit zu tun, dass ich das Programm unter Windows kompiliere?

Gruß


----------



## HoaX (4. Aug 2011)

Nein hat nichts mit dem Kompilieren zu tun. Und eine URL und eine Datei sind nun einmal zwei Paar Stiefel. Du kannst vielleicht den Bezeichner umwandeln, aber die Daten bleiben trotzdem da wo sie sind. Java selbst kann mit den Freigaben nichts anfangen. Wenn unter Windows \\rechner\freigabe bei File(String) funktioniert, dann nur, weil Windows das entsprechend behandelt. Und nur weil dein Dateibrowser mit smb://... was anfangen kann muss das Java noch lange nicht können. Mein Internetbrowser kann ja auch http://... öffnen, mein Taschenrechner aber nicht.

Bei URL gibts iirc getInputStream() oder so, evtl. funktioniert das. Ansonsten musst du halt die Freigabe wirklich mounten, oder dir mal jcifs ansehen.


----------



## userSeb (4. Aug 2011)

OK, danke!

Habs jetzt über jcifs gemacht. Funktioniert alles so, wie es soll. Folgendes ist bei rausgekommen


```
SmbFile file = null;
String user = "chuckN";
user = user + ":";
			
String password = "*******";
password = password + "@";
			
String urlToOpen = "smb://" + user + password + serverIP + path + partToOpen + ".wrl";
urlToOpen = urlToOpen.replace("\\","/");
			
String url = "smb://" + user + password + serverIP + path + part + ".wrl";
url = url.replace("\\","/");
			
try {
	file = new SmbFile(url);
		
	if (!file.exists()){
		BufferedReader in = new BufferedReader(
						new InputStreamReader(
							new SmbFileInputStream(urlToOpen)));
						
		BufferedWriter out = new BufferedWriter(
						new OutputStreamWriter(
							new SmbFileOutputStream(url)));
						
		String str;
		while ((str = in.readLine()) != null) { 
...
```

VG


----------

