Zum Hauptinhalt

Weitere Grundlegendende Programmierkonzepte in Java

Dateien lesen und schreiben

Unserem Tagebuch fehlt noch etwas ganz entscheidendes. Die Eingaben gehen immer gleich wieder verloren, wenn das Programm beendet wird. Wir brauchen also eine Möglichkeit die einzelnen Einträge zu speichern. Computer bieten zum Speichern von Daten vielfältige Möglichkeiten, wie Dateien oder Datenbanken. Alle diese Möglichkeiten stehen uns auch im Java zur Verfügung. Wir begnügen uns aber ersteinmal mit einfachen Textdateien.

Es gibt eine Vielzahl von unterschiedlichen Klassen in Java, die zum Lesen und Schreiben von Dateien genutzt werden können. Sie haben verschiedene Vorteile in manchen Einsatzbereichen, sind aber vielfach etwas komplex. Die hier vorgestellten zählen mit zu den Einfachsten.

Bevor wir beginnen wollen wir einmal die Main-Methode anpassen. Wir schreiben vor die geschweifte Klammer des Codeblocks throws Exception. Hiermit wird Java mitgeteilt, dass falls Fehler bei der Ausführung auftreten, diese nicht behandelt werden sollen. Das Programm stürzt in diesen Fällen einfach ab. Fehler könnten hier z.B. sein, dass das Programm eine Datei lesen soll, die nicht existiert oder an einen Ort schreiben soll, der schreibgeschützt ist. Wir werden uns später damit beschäftigen, wie wir besser mit Fehlern umgehen können.

Für das Schreiben von Dateien wollen wir die PrintWriter Klasse verwenden. Hierfür benötigt man als Erstes eine Instanz der Klasse File. Hiermit kann eine Datei beschrieben werden. Diese Datei muss aber nicht zwingend existieren. Man kann File-Instanzen mit absoluten Namen erstellen new File("C:/datei.txt") oder aber mit relativen Namen new File("datei.txt"). Bei relativen Namen wird sie in dem Verzeichnis angelegt, in dem das Programm ausgeführt wird. In Eclipse ist das das Projektverzeichnis. Wenn wir das Program aber später direkt starten, so kann dies anders sein. Haben wir eine File-Instanz, so kann eine PrintWriter-Instanz erstellt werden durch new PrintWriter(datei);. Ab jetzt können wir beliebigen Text in die Datei schreiben mit der Methode print("Text"). Es ist gute Praxis den PrintWriter mit close() zu schließen, wenn er nicht mehr verwendet werden soll.

Damit Java weiß welche Klassen verwendet werden sollen, ist es nötig diese erst zu importieren. Dafür schreiben wir ganz an den Anfang die Zeilen.


import java.io.File; import java.io.PrintWriter;

Danach kann es losgehen.


File datei = new File("datei.txt"); PrintWriter printWriter = new PrintWriter(datei); printWriter.print(text); printWriter.close();

Der PrintWriter legt eine neue Datei an, falls diese noch nicht existiert. Sollte schon eine Datei existieren, so wird sie überschrieben. 

Als Nächstes wollen wir den Inhalt unserer Datei wieder einlesen. Hier können wir wieder die Scanner-Klasse verwenden. Dieses Mal übergeben wir aber nicht System.in als Parameter sondern unsere File-Instanz. Das alleine reicht aus um einen Scanner zu erzeugen, der aus einer Datei ließt. 

Es ist hierbei wichtig, dass die Datei bereits existiert, da das Programm sonst abstürzt. Dafür verwenden wir die datei.exists() Methode der File Klasse.


String text = ""; File datei = new File("datei.txt"); if (datei.exists()) { Scanner scanner = new Scanner(datei); while (scanner.hasNextLine()) { text += scanner.nextLine() + "\n"; } scanner.close(); }

Mit der Methode scanner.hasNextLine() kann geprüft werden, ob es weitere Zeilen in der Datei gibt. Wenn ja, kann mit der Methode scanner.nextLine() die Zeile gelesen werden. 

Mit diesem neuen Wissen können wir nun unser Tagebuch erheblich verbesser:


import java.io.File; import java.io.PrintWriter; import java.util.Scanner; public class Tagebuch { public static void main(String[] args) throws Exception { System.out.println("Wie heißt du?"); Scanner scanner = new Scanner(System.in); String name = scanner.next(); if (name.equals("Jan")) { System.out.println("Hallo " + name + "!"); String text = ""; // Bisherige Einträge laden File datei = new File("tagebuch-" + name + ".txt"); if (datei.exists()) { Scanner scnr = new Scanner(datei); while (scnr.hasNextLine()) { text += scnr.nextLine() + "\n"; } scnr.close(); } System.out.println("Geladener Text: " + text); System.out.println("Bitte Text eingeben. Zum Beenden 'quit' eingeben."); // Schleife zum Einlesen des Textes while (true) { String eingabe = scanner.next(); // "quit" beendet die Schleife if (eingabe.equals("quit")) { break; } text += eingabe; } System.out.println("Eingegeben wurde: " + text); // Neuen Tagebuchinhalt speichern PrintWriter printWriter = new PrintWriter(datei); printWriter.print(text); printWriter.close(); } else { System.out.println("Der Benutzer ist abgelehnt."); } scanner.close(); } }