Files.lines în Java

Citește un fișier rând cu rând, ca Stream<String>; potrivit pentru fișiere mari. Se închide cu try-with-resources.

Sintaxă
static Stream<String> lines(Path cale) throws IOException
static Stream<String> lines(Path cale, Charset codare) throws IOException

Ce face Files.lines

Files.lines(cale) returnează un Stream<String> în care fiecare element este un rând. Rândurile se citesc pe măsură ce stream-ul le cere, deci poți prelucra fișiere mari fără să le ții întregi în memorie.

Stream-ul ține fișierul deschis. Folosește-l mereu într-un try-with-resources: try (Stream<String> rânduri = Files.lines(cale)) { ... }, ca fișierul să fie închis la final, chiar dacă apare o eroare.

Pe stream poți folosi tot ce știi: filter, map, count, collect. Sfârșiturile de rând sunt eliminate, ca la readAllLines.

Parametri

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

Ce returnează

Un Stream<String> cu rândurile fișierului (trebuie închis).

Exemple

Exemplul 1: Erorile dintr-un jurnal

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

public class Main {
    public static void main(String[] args) throws IOException {
        Path jurnal = Path.of("server.log");
        Files.write(jurnal, List.of(
                "INFO pornire server",
                "EROARE conexiune bază de date",
                "INFO cerere /acasa",
                "EROARE fișier lipsă: logo.png"));

        try (Stream<String> randuri = Files.lines(jurnal)) {
            randuri.filter(r -> r.startsWith("EROARE"))
                    .map(r -> r.substring(7))
                    .forEach(System.out::println);
        }
    }
}

Rezultat

conexiune bază de date
fișier lipsă: logo.png

Exemplul 2: Numărarea cuvintelor dintr-un fișier

Fiecare rând este împărțit în cuvinte cu flatMap; rezultatul este numărul total de cuvinte.

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) throws IOException {
        Path text = Path.of("text.txt");
        Files.writeString(text, "A fost odată ca-n povești\nA fost ca niciodată\n");

        try (Stream<String> randuri = Files.lines(text)) {
            long cuvinte = randuri.flatMap(r -> Arrays.stream(r.split("\\s+"))).count();
            System.out.println("Cuvinte: " + cuvinte);
        }
    }
}

Rezultat

Cuvinte: 9

Greșeli frecvente

  • Nu închizi stream-ul: fișierul rămâne deschis. Pe Windows nu îl mai poți șterge, iar într-un server se termină descriptorii de fișiere.
  • Returnezi stream-ul dintr-un try-with-resources și îl folosești în afară: este deja închis și primești IllegalStateException. Colectează rezultatul în interior.

Comenzi înrudite

  • Files.readAllLines: Citește un fișier text și returnează o listă cu rândurile lui, fără caracterele de sfârșit de rând.
  • BufferedReader.lines: Returnează rândurile rămase din reader ca Stream<String>, ca să le prelucrezi cu filter, map, count.
  • Stream.filter: Păstrează în stream doar elementele care îndeplinesc o condiție.
  • Files.readString: Citește tot conținutul unui fișier text într-un singur String (implicit în UTF-8).