Files.readAllLines în Java

Fișiere cu Files Java 7 (fără Charset: Java 8)

Citește un fișier text și returnează o listă cu rândurile lui, fără caracterele de sfârșit de rând.

Sintaxă
static List<String> readAllLines(Path cale) throws IOException
static List<String> readAllLines(Path cale, Charset codare) throws IOException

Ce face Files.readAllLines

Files.readAllLines(cale) citește tot fișierul și returnează un List<String>, câte un element pentru fiecare rând. Caracterele de sfârșit de rând (\n, \r\n) sunt eliminate, deci nu mai trebuie să le tai tu.

Lista se poate modifica și se poate parcurge de câte ori vrei. Ca la readString, tot fișierul ajunge în memorie; pentru fișiere uriașe folosește Files.lines, care citește leneș.

Parametri

Parametru Descriere
cale Fișierul citit.
codare Opțional: setul de caractere, implicit UTF-8.

Ce returnează

Un List<String> cu rândurile fișierului.

Exemple

Exemplul 1: Catalogul unei clase dintr-un fișier CSV

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;

public class Main {
    public static void main(String[] args) throws IOException {
        Path cale = Path.of("catalog.csv");
        Files.writeString(cale, "nume,nota\nAna,9\nRadu,7\nIoana,10\n");

        List<String> randuri = Files.readAllLines(cale);
        System.out.println("Rânduri citite: " + randuri.size());
        System.out.println("Antet: " + randuri.get(0));

        double suma = 0;
        for (String rand : randuri.subList(1, randuri.size())) {
            String[] campuri = rand.split(",");
            System.out.println(campuri[0] + " are nota " + campuri[1]);
            suma += Integer.parseInt(campuri[1]);
        }
        System.out.printf("Media: %.2f%n", suma / (randuri.size() - 1));
    }
}

Rezultat

Rânduri citite: 4
Antet: nume,nota
Ana are nota 9
Radu are nota 7
Ioana are nota 10
Media: 8.67

Exemplul 2: Sfârșiturile de rând Windows sunt eliminate

Fișierul are \r\n (ca pe Windows), dar rândurile citite nu mai conțin \r.

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;

public class Main {
    public static void main(String[] args) throws IOException {
        Path cale = Path.of("orase.txt");
        Files.writeString(cale, "Iași\r\nCluj\r\nSibiu\r\n");

        List<String> orase = Files.readAllLines(cale);
        for (String o : orase) {
            System.out.println("[" + o + "] " + o.length() + " litere");
        }
    }
}

Rezultat

[Iași] 4 litere
[Cluj] 4 litere
[Sibiu] 5 litere

Greșeli frecvente

  • Uiți că primul rând dintr-un CSV este antetul și încerci să-l transformi în număr: NumberFormatException.
  • Folosești readAllLines pe un jurnal de server de câțiva gigaocteți. Folosește Files.lines într-un try-with-resources.

Comenzi înrudite

  • Files.lines: Citește un fișier rând cu rând, ca Stream<String>; potrivit pentru fișiere mari. Se închide cu try-with-resources.
  • Files.readString: Citește tot conținutul unui fișier text într-un singur String (implicit în UTF-8).
  • Files.write: Scrie într-un fișier fie un tablou de octeți, fie o listă de rânduri (fiecare urmat de sfârșit de rând).
  • BufferedReader.readLine: Citește următorul rând de text, fără sfârșitul de rând; returnează null la sfârșitul sursei.