Java - In eine Datei mit eigener Dateiendung einen Text speichern und auslesen?
Hallo,
ich programmiere gerade mit Java (kein Javascript) meinen eigenen Texteditor und habe dazu eine eigene Dateiendung entwickelt(.edit). Ich möchte nun in meine Datei "Test.edit" einen Text aus einer JTextPane speichern und diesen wieder auslesen. Finde dazu aber kein Tutorial oder hilfreichen Artikel im Internet. Kann mir jemand dabei helfen?
edit: Die Fehlermeldung wird erst beim versuchten öffnen der Datei verursacht, weshalb ich vermute, dass es beim Öffnen ein Problem gibt.
LG Anonymer4User
4 Antworten
Behandle es so, wie eine normale Textdatei. Dazu gibt es viele Tutorials / Artikel.
Mir fällt auf, dass du nirgendwo Exception Handling betreibst und beim Auslesen versuchst, den Reader in einen String umzuwandeln und in das TextPane zu setzen:
reader.toString()
Schreiben geht so:
private static void write() {
File fileToSave = new File("test.edit");
String path = fileToSave.getAbsolutePath();
try(FileWriter fileWriter = new FileWriter(path)) {
fileWriter.write("Some text");
}
catch (IOException ex) {
ex.printStackTrace();
}
}
Und Lesen so:
private static void read() {
File file = new File("test.edit");
if (file.getName().endsWith(".edit")) {
try (FileReader fileReader = new FileReader(file.getAbsolutePath())) {
int currentCharacter = fileReader.read();
while(currentCharacter != -1) {
System.out.print((char)currentCharacter);
currentCharacter = fileReader.read();
}
}
catch (FileNotFoundException fileNotFoundException) {
fileNotFoundException.printStackTrace();
}
catch (IOException ex) {
ex.printStackTrace();
}
}
}
und habe dazu eine eigene Dateiendung entwickelt(.edit).
Die Dateiendung spielt keine Rolle. Deine Datei kann jede Endung haben, so lange die Daten in der Datei in einem Format sind, das deine Anwendung verarbeiten kann.
Ich möchte nun in meine Datei "Test.edit" einen Text aus einer JTextPane speichern und diesen wieder auslesen.
Du solltest hier View und Model voneinander trennen. Es spielt keine Rolle, dass der Text in einem JTextPane steht. Text speicherst Du in Java in einem String (Zeichenkette). Also machen wir uns an dieser Stelle auch keine Gedanken über igrendwelche GUI Elemente.
In Java stehen Dir zwei Möglichkeiten zur Verfügung mit Dateien zu arbeiten:
- java.io (Stream orientiert, blocking IO)
- java.nio (Buffer orientiert, non-blocking IO)
Da Du wohl noch nicht viel mit Java programmiert hast, empfehle ich Dir java.io. Beim Einlesen der Datei solltest Du noch zwei Sachen beachten: (1) Schließe den Stream, wenn Du diesen nicht mehr brauchst und (2) achte auf das Encoding der Datei. Du kannst das Encoding beim Einlesen zuvor angeben.
Für das Schreiben würde ich das so machen:
file = new File(path);
BufferedWriter wrt = new BufferedWriter(new FileWriter(file));
wrt.write(gui.text.getText()); //Hier ist gui.text das JTextPanel
wrt.close();
Für das lesen so:
Scanner sc = new Scanner(file);
String inhalt = "";
while (sc.hasNextLine()) {
inhalt += sc.nextLine();
inhalt += "\n“;
}
sc.close();
Stirngs in der Form zu konkatenieren ist alles andere als sinnvoll und frisst nur Speicher. Man sollte mit einem StringBuffer arbeiten.
Ich habe meine Datei folgender Maßen erstellt:
--
File fileToSave = fileChooser.getSelectedFile();
pfad = fileToSave.getAbsolutePath();
FileOutputStream output = new FileOutputStream(pfad + ".edit");
File fil = new File(output.toString());
FileWriter writer = new FileWriter(fil);
writer.write(Editor.textPane.getText().trim());
writer.close();
--
Und zum auslesen habe ich folgende Zeilen benutzt:
--
File file = new File(chooser.getSelectedFile(), null);
if(file.getName().endsWith(".edit")) {
char[] c = new char[10024];
FileReader reader = new FileReader(file);
reader.read(c);
Editor.textPane.setText(reader.toString());
reader.close();
--
Was mache ich falsch?
Der Code mit dem FileOutputStream und FileWriter ergibt keinen Sinn. Informiere Dich über den Unterschied zwischen Reader/Writer und Input-/Outputstream. Reader/Write arbeiten Zeichen-orientiert und Input-/Outputstreams arbeiten Byte-orientiert.
Und beim FileReader würde ich auch nicht mit einem char Array arbeiten. Lies doch Zeilenweise die Datei ein.
Habe ich zuerst, doch dann habe ich die Endung geändert und nun funktioniert es nicht mehr.