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()șilines()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.