Javaschubla.de - Java als erste Programmiersprache

In Dateien schreiben

Um Text in eine Datei zu schreiben, benötigt man einen FileWriter. Man kann auch gleich mit dem FileWriter schreiben, aber es empfiehlt sich einen BufferedWriter darüber zu legen, das ist effizienter.

Wir wollen eine Datei ausgabe.txt erstellen. Wenn sie nicht vorhanden ist, wird sie automatisch erstellt, wenn sie vorhanden ist, wird sie ohne nachzufragen überschrieben - es sei denn, sie ist schreibgeschützt, dann gibt es eine Exception. Wenn man unter Linux keine Schreibrechte für diesen Ordner hat, gibt es ebenfalls eine Exception.

In die Datei wollen wir zwei Zeilen schreiben:

test test test
tset tset tset

oder irgendetwas, was dir einfällt.

Einen Writer oder OutputStream sollte man immer mit close() schließen. Wenn man einen BufferedWriter schließt, wird auch der darunterliegende Stream geschlossen.

"throws IOException" wird bei den Exceptions später erklärt.

Erster Versuch:

import java.io.*;

class WriteFile
{
  public static void main(String[] args) throws IOException
  {
    FileWriter fw = new FileWriter("ausgabe.txt");
    BufferedWriter bw = new BufferedWriter(fw);

    bw.write("test test test");
    bw.write("tset tset tset");

    bw.close();
  }
}

Für den Anfang nicht schlecht, aber in der Datei steht unerfreulicherweise nur eine Zeile, nämlich:

test test testtset tset tset

Schreiben wir also dazwischen ein \n für "newline" in die Datei:

import java.io.*;

class WriteFile
{
  public static void main(String[] args) throws IOException
  {
    FileWriter fw = new FileWriter("ausgabe.txt");
    BufferedWriter bw = new BufferedWriter(fw);

    bw.write("test test test");
    bw.write("\n");
    bw.write("tset tset tset");

    bw.close();
  }
}

Wer Linux benutzt, denkt jetzt: Prima, hat geklappt. Aber die Windowsbenutzer sehen wieder nur eine Zeile, nur ist zwischen dem letzten "test" und dem ersten "tset" nur ein schwarzes Kästchen (zumindest, wenn man Notepad benutzt, Wordpad hingegeben und manche anderen Editoren zeigen zwei Zeilen und kein Kästchen). Das liegt daran, dass zwar unter Linux \n das Zeichen für einen Zeilenumbruch in einer Datei ist, unter Windows ist es aber \r\n und auf Macs ist es \r. Welches es ist, steht im Systemproperty line.separator. Den Wert eines Systempropertys kann man mit System.getProperty herausfinden.

import java.io.*;

class WriteFile
{
  public static void main(String[] args) throws IOException
  {
    FileWriter fw = new FileWriter("ausgabe.txt");
    BufferedWriter bw = new BufferedWriter(fw);

    bw.write("test test test");
    String n = System.getProperty("line.separator");
    bw.write(n);
    bw.write("tset tset tset");

    bw.close();
  }
}

Das wird nun unter Windows, Linux und MacOS korrekt angezeigt. Aber es geht auch einfacher - der BufferedWriter stellt eine Methode newLine() dafür bereit.

import java.io.*;

class WriteFile
{
  public static void main(String[] args) throws IOException
  {
    FileWriter fw = new FileWriter("ausgabe.txt");
    BufferedWriter bw = new BufferedWriter(fw);

    bw.write("test test test");
    bw.newLine();
    bw.write("tset tset tset");

    bw.close();
  }
}

Übung

Probiere aus, was passiert, wenn die Datei schreibgeschützt ist. (Verwirrenderweise auch eine FileNotFoundException, aber die Fehlermeldung enthält auch den Text "Zugriff verweigert".)


In der nächsten Lektion geht es um Fehlerbehandlung mit Exceptions.