Как читать из файлов с Files.lines(...). ForEach (...)?

В настоящее время я пытаюсь читать строки из текстового файла, который у меня есть. Я нашел в другом stackoverflow (Чтение простого текстового файла в Java), который вы можете использовать Files.lines(..). ForEach (..) Однако я не могу понять, как использовать для каждой функции чтение строки за строкой, Кто-нибудь знает, где искать это или как это сделать?

Ответ 1

Пример содержимого test.txt

Hello
Stack
Over
Flow
com

Код для чтения из этого текстового файла с использованием методов lines() и forEach().

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class FileLambda {

    public static void main(String JavaLatte[]) {
        Path path = Paths.get("/root/test.txt");
        try (Stream<String> lines = Files.lines(path)) {
            lines.forEach(s -> System.out.println(s));
        } catch (IOException ex) {
          // do something or re-throw...
        }
    }
}

Ответ 2

С Java 8, если файл существует в classpath:

Files.lines(Paths.get(ClassLoader.getSystemResource("input.txt")
                    .toURI())).forEach(System.out::println);

Ответ 3

Files.lines(Path) ожидает аргумент Path и возвращает Stream<String>. Stream#forEach(Consumer) ожидает аргумент Consumer. Поэтому вызовите метод, передав ему Consumer. Этот объект должен быть реализован, чтобы делать то, что вы хотите для каждой строки.

Это Java 8, поэтому вы можете использовать лямбда-выражения или ссылки на методы для предоставления аргумента Consumer.

Ответ 4

Я создал образец, вы можете использовать Stream для фильтрации /

public class ReadFileLines {
    public static void main(String[] args) throws IOException {
        Stream<String> lines = Files.lines(Paths.get("C:/SelfStudy/Input.txt"));
//      System.out.println(lines.filter(str -> str.contains("SELECT")).count());

//Stream gets closed once you have run the count method.
        System.out.println(lines.parallel().filter(str -> str.contains("Delete")).count());
    }
}

Пример input.txt.

SELECT Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Delete Every thing
Delete Every thing

Ответ 5

Избегайте возврата списка с:

List<String> lines = Files.readAllLines(path); //WARN

Помните, что весь файл читается при Files::readAllLines, а результирующий массив String хранит все содержимое файла в памяти одновременно. Поэтому, если файл значительно велик, вы можете столкнуться с OutOfMemoryError пытается загрузить все данные в память.

Вместо этого используйте stream: используйте Files.lines(Path) который возвращает объект Stream<String> и не страдает от этой же проблемы. Содержимое файла читается и обрабатывается лениво, что означает, что только небольшая часть файла хранится в памяти в любой момент времени.

Files.lines(path).forEach(System.out::println);