EMZETT.
Login

Read Files

Kurz: Inhalt einer Datei einlesen — z. B. zeilenweise mit BufferedReader oder auf einen Schlag mit Files.readAllLines(path).

Genauer: Zeilenweises Lesen mit BufferedReader.readLine() (gibt null zurück, wenn das Dateiende erreicht ist) eignet sich für große Dateien, die nicht komplett in den Speicher passen sollen. Files.readAllLines(...) ist kompakter, lädt aber die gesamte Datei auf einmal.

Im Detail

// Variante 1: zeilenweise, speicherschonend für große Dateien
try (BufferedReader br = new BufferedReader(new FileReader("gross.txt"))) {
    String zeile;
    while ((zeile = br.readLine()) != null) {
        // jede Zeile einzeln verarbeiten, ohne die ganze Datei im Speicher zu halten
    }
}
 
// Variante 2: alles auf einmal, kompakt für kleine/mittlere Dateien
List<String> alleZeilen = Files.readAllLines(Path.of("klein.txt"));
String kompletterText = Files.readString(Path.of("klein.txt")); // seit Java 11
 
// Variante 3: als Stream verarbeiten, ohne alles gleichzeitig zu laden
try (Stream<String> zeilen = Files.lines(Path.of("gross.txt"))) {
    long anzahlFehler = zeilen.filter(z -> z.contains("ERROR")).count();
}

Die Wahl zwischen den drei Varianten hängt fast ausschließlich von der Dateigröße ab: Files.readAllLines()/readString() sind am kompaktesten zu schreiben, laden aber die KOMPLETTE Datei auf einmal in den Speicher — bei einer mehrere Gigabyte großen Log-Datei würde das den verfügbaren Heap-Speicher sprengen. BufferedReader.readLine() oder Files.lines() (das einen Stream<String> liefert, der lazy/schrittweise ausgewertet wird) verarbeiten dagegen jeweils nur einen kleinen Teil gleichzeitig und eignen sich deshalb für beliebig große Dateien. Files.lines() MUSS in einem try-with-resources-Block stehen, weil der zugrundeliegende Datei-Handle sonst offen bleibt, selbst wenn der Stream nicht vollständig konsumiert wird.

Siehe auch: Files, BufferedReader, I/O Streams