如何使用Files.lines(...).forEach(...)读取文件?

use*_*058 15 java foreach file filereader line-by-line

我目前正在尝试从我拥有的纯文本文件中读取行.我发现另一个stackoverflow(用Java读取纯文本文件)你可以使用Files.lines(..).forEach(..)但是我实际上无法弄清楚如何使用for each函数来读取line by行文本,任何人都知道在哪里寻找或如何这样做?

par*_*085 27

test.txt的示例内容

Hello
Stack
Over
Flow
com
Run Code Online (Sandbox Code Playgroud)

使用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...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 对流使用try-with-resources以确保它自动关闭:`try(Stream <String> lines = Files.lines(path)){` (9认同)
  • 您可以使用方法引用:`System.out :: println`,它仍然会被转换为相同的字节码. (3认同)
  • 请不要在生产代码中编写这样的空 catch 块。 (2认同)

小智 7

避免返回带有以下内容的列表:

List<String> lines = Files.readAllLines(path); //WARN
Run Code Online (Sandbox Code Playgroud)

请注意,Files::readAllLines调用时会读取整个文件,生成的 String 数组一次将文件的所有内容存储在内存中。因此,如果文件非常大,您可能会遇到OutOfMemoryError试图将其全部加载到内存中的情况。

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

Files.lines(path).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)


Arp*_*wal 6

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

Files.lines(Paths.get(ClassLoader.getSystemResource("input.txt")
                    .toURI())).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)


Sot*_*lis 3

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

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