BufferedReader.lines în Java

Returnează rândurile rămase din reader ca Stream<String>, ca să le prelucrezi cu filter, map, count.

Sintaxă
Stream<String> lines()

Ce face BufferedReader.lines

lines() transformă un BufferedReader într-un Stream<String>. Rândurile se citesc pe măsură ce stream-ul le cere. Poți folosi apoi toate operațiile de stream: filter, map, count, collect.

Stream-ul nu închide reader-ul; închide-l tu, cu try-with-resources pe reader. Este util pentru surse care nu sunt fișiere (tastatură, rețea); pentru fișiere există direct Files.lines.

Ce returnează

Un Stream<String> cu rândurile rămase.

Exemple

Exemplul 1: Produsele scumpe dintr-o listă primită la intrare

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        in.lines()
                .map(r -> r.split(";"))
                .filter(p -> Integer.parseInt(p[1]) > 50)
                .forEach(p -> System.out.println(p[0] + " costă " + p[1] + " lei"));
    }
}

Ce scrie utilizatorul (intrare)

cafea;32
căști;180
pix;4
rucsac;95

Rezultat

căști costă 180 lei
rucsac costă 95 lei

Exemplul 2: Numărarea cuvintelor distincte

Rândurile sunt împărțite în cuvinte, scrise cu litere mici și strânse într-un TreeSet (sortat, fără duplicate).

import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.Arrays;
import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) throws IOException {
        String text = "Mama are mere\nmama are și pere\n";
        try (BufferedReader in = new BufferedReader(new StringReader(text))) {
            Set<String> cuvinte = in.lines()
                    .flatMap(r -> Arrays.stream(r.split(" ")))
                    .map(String::toLowerCase)
                    .collect(Collectors.toCollection(TreeSet::new));
            System.out.println(cuvinte.size() + " cuvinte: " + cuvinte);
        }
    }
}

Rezultat

5 cuvinte: [are, mama, mere, pere, și]

Greșeli frecvente

  • Amesteci readLine() și lines() pe același reader fără să știi că lines() începe de unde a rămas citirea.
  • Crezi că închiderea stream-ului închide fișierul. Închide reader-ul.

Comenzi înrudite

  • BufferedReader: Citește text eficient, rând cu rând, dintr-un fișier, de la tastatură sau din alt Reader; close închide sursa.
  • 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.
  • Stream.filter: Păstrează în stream doar elementele care îndeplinesc o condiție.
  • 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.