Wie kann man in eine Textdatei schreiben?

Die Klasse PrintWriter stellt Methoden bereit, mit denen in eine Textdatei geschrieben werden kann.
Sie ist eine von sieben Klassen, die sich von der abstrakten Klasse Writer ableiten.

Verfahren bis Java 6

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Path;

public class DateiSchreibenClass {
    public static void main(String[] args) {
        printConventionally();
    }

    private static void printConventionally() {
        PrintWriter pWriter = null;
        String s = "/Users/jo/Desktop/test.txt";
        try {
            pWriter = new PrintWriter(new FileWriter(s));
            pWriter.println("Hallo Welt!");
        } catch (IOException ioe) {
            ioe.printStackTrace();
        } finally {
            if (pWriter != null) {
                pWriter.flush();
                pWriter.close();
            }
        }
    }
}

In der main()-Methode des Beispiels befindet sich ein try-catch-Block, der dazu dient, eventuelle Fehler bei Ausführung der kaskadierten Datenströme abzufangen. Das PrintWriter-Objekt erwartet als Parameter einen OutputStream, der hier durch ein neu gebildetes FileWriter-Objekt gegeben ist1. Abhängig von der zugrunde liegenden Platform erzeugt er ggfs. die als Parameter-String angegebene Datei, falls diese nicht bereits existieren sollte. Der FileWriter wird durch einen BufferedWriter gekapselt. Ohne diese Pufferung würde jeder Aufruf der Methode print() die Konvertierung eines Zeichens in ein byte verlangen - eine kostspielige Angelegenheit!

Die Methode println() schreibt schließlich den übergebenen String zunächst in einen internen Puffer, der durch flush() freigegeben wird und den Inhalt in die Datei schreibt. Hierbei werden evtl. bereits vorhandene Dateiinhalte gelöscht. Durch Übergabe eines zweiten boolean-Parameters an den Konstruktor des PrintWriter kann der Puffer bei Aufruf der Methoden printf(), println oder format() automatisch geschrieben werden. Ein gesonderter Aufruf von flush() ist dann nicht mehr nötig.

PrintWriter pWriter = new PrintWriter(new FileWriter("test.txt"), true);

Wird bei der Objektbildung true als zweiter Parameter an den Konstruktor des FileWriters übergeben, wird die Ausgabedatei nicht überschrieben, sondern der Text am Ende angehängt:

PrintWriter pWriter = new PrintWriter(new FileWriter("test.txt", true), true);

Verfahren ab Java 7

v.7In Java 1.7 wurde das try-with-resources-Statement eingeführt, das die Schreibarbeit bei Datenströmen etwas verringerte. Zudem erfolgt das Schließen des Stroms automatisch. Der folgende Quelltext zeigt die Anwendung.

private static void printJava7() {
    String s = "/Users/jo/Desktop/test.txt";
    try (PrintWriter pWriter = new PrintWriter(new FileWriter(s));){
        pWriter.println("Hallo Welt!");
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
}

Verfahren ab Java 11

v.11Mit Java 1.7 wurden mit dem Package java.nio (nio = new input/output) neue Möglichkeiten eröffnet, um Eingabe- und Ausgabe-Operationen zu handhaben. Ab Java 11 wurden dann der Klasse java.nio.Files u.a. die statischen Methoden writeString() und readString() hinzugefügt, die die benötigen Writer bzw Reader kapseln. Der Quelltext demonstriert deren Anwendung.

private static void printJava11() {
    Path p = Path.of("/Users/jo/Desktop/test.txt");
    try {
        Path filePath = Files.writeString(p, "Hallo Welt!");
        String s = Files.readString(filePath);
        System.out.println(s);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

1) In Java 1.5 kann dem PrintWriter der Dateinamens-String direkt übergeben werden, statt ein File-Objekt zu verwenden.

Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.