PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java] Problem mit FileWriter


redfalcon
2006-02-24, 18:57:56
Huhu,

in der Schule haben wir eine Klasse programmiert, die einfach eine Textdatei mit Inhalt auf die Festplatte schreibt. Nun wollte ich dieses Programm so "verbessern", dass man Dateinamen und Inhalt per Eingabe vom Nutzer festlegt. Funzt aber leider nicht. Die Datei wird einfach nicht erstellt. Lege ich Inhalt und Dateiname im Code fest, funktioniert alles. Warum aber nicht, wenn die Eingaben vom User gemacht werden sollen? Die Fehler muss ganz banal sein, da auch unser Tewi-Lehrer ewig mit mir rumprobiert hat. Die *.txt Datei wird im selben Verzeichnis erstellt werden, aus der das Programm gestartet wird.

Code:


import java.io.*;

public class Stream{

public Stream(){

}

//Input-Methode
public String stringInput(){
StringBuffer temp = new StringBuffer();
InputStreamReader ir = new InputStreamReader(System.in);
try {
do {
temp.append((char) ir.read());
} while ( ir.ready());

}

catch (IOException e) {

}
return temp.toString();





}

public void dateiSchreiben(String datei, String inhalt){

File fi = new File(datei);
try{
//Falls Datei existiert, lösche die Datei und erstelle Neue.
if ( fi.exists() ) {
fi.delete();
fi.createNewFile();
}

//Inhalt in Date schreiben.
FileWriter fw = new FileWriter(fi);
fw.write(inhalt);
fw.close();
}
catch(IOException e){

}


}


public static void main (String args[]){
String datei; //Dateiname
String inhalt; //Inhalt der Datei

Stream se = new Stream();

System.out.println("Dateiname im Format xyz.txt eingeben: ");
datei = se.stringInput();
System.out.println(datei); //Nur zur Überwachung
System.out.println("Inhalt der Datei eingeben: ");
inhalt = se.stringInput();
System.out.println(inhalt); //Nur zur Überwachung

se.dateiSchreiben(datei, inhalt);

}
}

Magnum
2006-02-24, 20:17:59
Also zumindest musst du die Datei auch anlegen, wenn sie nicht existiert!

....
public void dateiSchreiben(String datei, String inhalt){

File fi = new File(datei);
try{
//Falls Datei existiert, lösche die Datei und erstelle Neue.
if ( fi.exists() ) {
fi.delete();
fi.createNewFile();
} else { // das hier muss dazu
fi.createNewFile();
}

//Inhalt in Date schreiben.
FileWriter fw = new FileWriter(fi);
fw.write(inhalt);
fw.close();
}
catch(IOException e){

}


}
...

Ich bekomme jetzt aber immer noch die Fehlermeldung: "Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch". kA was da grad los ist, aber probiers mal selbst!

redfalcon
2006-02-25, 10:14:19
Also zumindest musst du die Datei auch anlegen, wenn sie nicht existiert!

Ich bekomme jetzt aber immer noch die Fehlermeldung: "Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch". kA was da grad los ist, aber probiers mal selbst!

Ich hab jetzt in die catch-Blöcke mal ein printStackTrace() hinzugefügt, und bekomme dann nach der Eingabe deinen genannten Fehler:

java.io.FileNotFoundException: xyz.txt
(The filename, directory name, or volume label syntax is incorrect)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
at java.io.FileOutputStream.<init>(FileOutputStream.java:131)
at java.io.FileWriter.<init>(FileWriter.java:73)
at Stream.dateiSchreiben(Stream.java:45)
at Stream.main(Stream.java:70)

Abnaxos
2006-02-25, 13:07:02
Ich hab jetzt in die catch-Blöcke mal ein printStackTrace() hinzugefügt,
Damit hast du schonmal Regel Nr. 1 gelernt: Niemals Exceptions einfach "verschlucken".

java.io.FileNotFoundException: xyz.txt
(The filename, directory name, or volume label syntax is incorrect)
Ich sehe sowieso nicht ganz, wann genau du in stringInput() aufhörst, die Eingabe auszulesen. Aber egal, da hat es vermutlich noch ein Newline oder sonst irgendwelche "komischen" Zeichen im Dateinamen.

Magnum
2006-02-25, 15:09:23
Ich sehe sowieso nicht ganz, wann genau du in stringInput() aufhörst, die Eingabe auszulesen. Aber egal, da hat es vermutlich noch ein Newline oder sonst irgendwelche "komischen" Zeichen im Dateinamen.Genau das ist das Problem. Die Methode, die benutzt wird um den String einzulesen, speichert irgendwas fürs Zeilenend! "\n" ist es jeden Falls nicht.

Aber wenn man statt:

do {
temp.append((char) ir.read());
} while ( ir.ready());
das hier einsetzt:

do {
int i = ir.read();
if(i != 10 && i != 13)
temp.append((char) i);
} while ( ir.ready());
sollte es gehen!

redfalcon
2006-02-25, 15:24:51
das hier einsetzt:

do {
int i = ir.read();
if(i != 10 && i != 13)
temp.append((char) i);
} while ( ir.ready());
sollte es gehen!

Klasse, danke! Funktioniert einwandfrei. Was genau bewirkt diese Abfrage auf ungleich 10 und 13?

Trap
2006-02-25, 15:35:28
10 und 13 sind die ASCII-Codes für Newline und Carriage Return