Как прочитать файл построчно
Короткий ответ
Пусть есть файл log.txt:
INFO start
ERROR disk full
INFO retry
ERROR timeoutFiles.lines() читает файл лениво, по одной строке. Поток держит файл открытым, поэтому оберните его в try с ресурсами — он закроет файл сам:
void main() throws IOException {
try (Stream<String> lines = Files.lines(Path.of("log.txt"))) {
lines.filter(line -> line.startsWith("ERROR")).forEach(IO::println);
}
}Результат:
ERROR disk full
ERROR timeoutBufferedReader
Классический способ — читать в цикле, пока readLine() не вернёт null:
void main() throws IOException {
try (BufferedReader reader = Files.newBufferedReader(Path.of("log.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
IO.println(line.length() + " " + line);
}
}
}Результат:
10 INFO start
15 ERROR disk full
10 INFO retry
13 ERROR timeoutС номерами строк
Заведите счётчик в цикле:
void main() throws IOException {
try (var reader = Files.newBufferedReader(Path.of("log.txt"))) {
int number = 0;
String line;
while ((line = reader.readLine()) != null) {
number++;
if (line.contains("timeout")) {
IO.println("line " + number + ": " + line);
}
}
}
}Результат:
line 4: ERROR timeoutЧастая ошибка
Использовать Files.lines() без try. Файл остаётся открытым до сборки мусора; в долго работающей программе открытые файлы накапливаются, и система перестаёт открывать новые. Всегда пишите try (var lines = Files.lines(...)).
Функции из этого ответа
- Files.lines() — Читает файл лениво — как поток строк, не загружая его в память целиком.
- BufferedReader — Читает текст построчно с буферизацией — классический способ обработки больших файлов.
- Files.readAllLines() — Читает текстовый файл в список строк.