Wie kann eine Text-Datei ausgelesen werden?

Seit Java 11 ist das Verfahren zum Auslesen einer textbasierten Datei erheblich vereinfacht worden. Der Artikel zeigt das aktuelle und das vor Java 11 gebräuchliche Verfahren.

Verfahren ab Java 11

v.11Mit der Java-Version 11 wurde in der Klasse java.nio.file.Files die Methode readString​() eingeführt. Sie existiert in zwei überladenen Versionen: readString(Path path) und readString(Path path, Charset cs). Beide liefern den Inhalt einer Datei als String-Objekt. Der Pfad zur Datei wird durch das Argument path übergeben. Durch ein zweites Argument kann der in der Datei verwendete Zeichensatz angegeben werden. Als Standard wird hier UTF8 verwendet.

public class DateiAuslesenNeuClass {

    private static void liesDatei(String datName) {
        try {
            String s = Files.readString(Path.of(datName));
            System.out.println(s);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        String datName = "/Pfad/zur/Datei.txt";
        liesDatei(datName);
    }
}

Im Beispiel wird das benötigte Path-Objekt durch dessen statische Methode of() erzeugt. Sie wurde ebenfalls erst mit Java 11 eingeführt und kann als Argument entweder einen Pfad-String (s.o.) oder mehrere, hintereinander zu lesende Pfadabschnitte übergeben bekommen.

Path.of("/Pfad", "zur", "Datei")

Wichtig ist, dass die Leseroutine in einen try-catch-Block gefasst wird, um diesbezügliche Fehler abfangen zu können.

Verfahren vor Java 11

Das Verfahren besteht darin, dass ein FileReader einen Character-Strom ausliest, der dann in einem StringBuffer zwischengespeichert wird.
Im Beispiel wird zunächst ein File-Objekt der auszulesenden Datei gebildet, die anschließend auf Existenz und Lesbarkeit geprüft wird. Ein leerer StringBuffer wird instanziert. Er stellt eine im Gegensatz zum String veränderbare Character-Sequenz dar.
Innerhalb einer while-Schleife liest der FileReader die einzelnen Characters einschließlich Zeilenumbrüchen, Tabulatoren, etc. in Form von (Unicode-)int -Werten aus. Sie müssen anschließend, bevor sie dem StringBuffer hinzugefügt werden, zu char gecastet werden. Nach Abschluss der Operation müssen der FileReader geschlossen und der StringBufferr noch zu String gecastet werden.
Da der FileReader bei Problemen eine IOException werfen kann, wird der Lesevorgang in einem try-catch-Block gekapselt.

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class DateiAuslesenClass {

    private static void ladeDatei(String datName) {

        File file = new File(datName);

        if (!file.canRead() || !file.isFile())
            System.exit(0);

        FileReader fr = null;
        int c;
        StringBuffer buff = new StringBuffer();
        try {
            fr = new FileReader(file);
            while ((c = fr.read()) != -1) {
                buff.append((char) c);
            }
            fr.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println(buff.toString());
    }

    public static void main(String[] args) {
        String dateiName = "test.txt";
        ladeDatei(dateiName);
    }
}

v.7 Ab Java 7 kann der Code durch die Verwendung des try-with-resources-Statements noch etwas vereinfacht werden:

try (FileReader fr = new FileReader(file)) {
    while ((c = fr.read()) != -1) {
        buff.append((char) c);
    }
} catch (IOException e) {
    e.printStackTrace();
}

Eine weitere bequeme Möglichkeit, um eine Datei auszulesen, stellt die Klasse Scanner zur Verfügung. Siehe hierzu auch den gleichnamigen Artikel.

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