如何使用files.lines(..).forEach(..)从文件中读取



我目前正在尝试从一个纯文本文件中读取行。我在另一个stackoverflow(阅读Java中的纯文本文件)上发现,您可以使用Files.lines(..).forEach(..)然而,我真的不知道如何使用for each函数逐行读取文本,有人知道在哪里查找或如何查找吗?

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 args[]) {
        Path path = Paths.of("/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...
        }
    }
    
}

避免返回带有:的列表

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

请注意,当调用Files::readAllLines时,将读取整个文件,生成的字符串数组将文件的所有内容同时存储在内存中。因此,如果文件非常大,您可能会遇到OutOfMemoryError试图将所有文件加载到内存中。

请改用流:使用返回Stream<String>对象的Files.lines(Path)方法,该方法不会遇到同样的问题。文件的内容是延迟读取和处理的,这意味着在任何给定时间,只有文件的一小部分存储在内存中。

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

使用Java 8,如果文件存在于classpath:中

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

Files.lines(Path)需要一个Path参数并返回一个Stream<String>Stream#forEach(Consumer)需要一个Consumer参数。因此,调用该方法,向其传递一个Consumer。必须实现该对象才能对每一行执行您想要的操作。

这是Java 8,因此您可以使用lambda表达式或方法引用来提供Consumer参数。

我已经创建了一个示例,您可以使用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());
    }
}

示例输入.txt.

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

相关内容

  • 没有找到相关文章

最新更新