Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как прочитать файл построчно

Короткий ответ

Пусть есть файл log.txt:

INFO start
ERROR disk full
INFO retry
ERROR timeout

Files.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 timeout

BufferedReader

Классический способ — читать в цикле, пока 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() — Читает текстовый файл в список строк.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.