Java java.nio.file.Files.lines()Метод

Java File Java java.nio.file.Files

Files.lines()Метод является статическим методом, появившимся в Java 8, расположенным вjava.nio.file.Filesклассе. Его основное назначение — возвращать содержимое файла в виде потока строк (Stream<String>), где каждая строка представляет строку файла.

Определение метода

public static Stream<String> lines(Path path) throws IOException
public static Stream<String> lines(Path path, Charset cs) throws IOException

Метод имеет две перегруженные версии:

  1. Первая версия читает файлы, используя кодировку по умолчанию (UTF-8)
  2. Вторая версия позволяет указать кодировку

Основные возможности

1. Ленивое вычисление

lines()Метод возвращает Stream, что означает ленивое вычисление. Файл не загружается полностью в память за один раз, а читается по мере необходимости, что особенно полезно при обработке больших файлов.

2. Автоматическое управление ресурсами

Когда операция потока завершается (нормально или прерывается исключением), поток автоматически закрывает связанные с ним файловые ресурсы. Однако лучшей практикой всё равно остаётся использование конструкции try-with-resources, чтобы гарантировать правильное освобождение ресурсов.

3. Обработка символов конца строки

Метод автоматически распознаёт различные символы конца строки:

  • \n(Unix/Linux)
  • \r\n(Windows)
  • \r(старый Mac)

Базовое использование

Пример 1: Простое чтение файла

Пример

import java.nio.file.*;
import java.io.IOException;
import java.util.stream.Stream;

public class FilesLinesExample {
    public static void main(String[] args) {
        Path path = Paths.get("example.txt");
       
        try (Stream<String> lines = Files.lines(path)) {
            lines.forEach(System.out::println);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Пример 2: Использование указанной кодировки

Пример

try (Stream<String> lines = Files.lines(path, StandardCharsets.ISO_8859_1)) {
    lines.filter(line -> !line.isEmpty())
         .forEach(System.out::println);
} catch (IOException e) {
    e.printStackTrace();
}

Продвинутое использование

1. Комбинирование с Stream API

Пример

// Подсчёт непустых строк
long count = Files.lines(path)
                 .filter(line -> !line.trim().isEmpty())
                 .count();

// Найти строки, содержащие заданное слово
List<String> targetLines = Files.lines(path)
                               .filter(line -> line.contains("important"))
                               .collect(Collectors.toList());

2. Параллельная обработка

Пример

// Обработка строк файла в параллельном режиме
Files.lines(path)
     .parallel()
     .map(String::toUpperCase)
     .forEachOrdered(System.out::println);

Примечания

  1. Управление ресурсами: Хотя поток закрывается автоматически, при сложных операциях с потоками всё же рекомендуется явно использовать try-with-resources.

  2. Вопросы производительности: Для небольших файлов,Files.readAllLines()может быть проще; но для больших файлов,lines()является лучшим выбором.

  3. Проблемы с кодировкой: Если кодировка файла отличается от системной кодировки по умолчанию, обязательно указывайте правильную кодировку; иначе можно прочитать искажённый текст.

  4. Обработка исключений: Операции ввода-вывода могут вызывать исключения, и их нужно правильно обрабатывать.


Сравнение производительности

Метод Особенности Применимые сценарии
Files.lines() Ленивая загрузка, высокая эффективность использования памяти Обработка больших файлов
Files.readAllLines() Загружает все строки в память сразу Обработка небольших файлов
BufferedReader.readLine() Традиционный подход, ручное управление Когда требуется точный контроль

Итог

Files.lines()Этот метод объединяет Stream API из Java 8 с эффективными возможностями обработки файлов NIO, предоставляя современное и краткое решение для чтения файлов. Он особенно подходит для обработки больших файлов и выполнения сложных операций на уровне строк. Освоение этого метода может значительно повысить читаемость и эффективность кода обработки файлов.

В реальной разработке, исходя из размера файла, требований к обработке и потребностей в производительности, разумно выбиратьlines()、readAllLines()или традиционные методы IO для написания оптимального кода обработки файлов.

Java File Java java.nio.file.Files

Другие расширения