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

时间:2014-04-24 17:59:05

标签: java file foreach filereader line-by-line

我正在尝试从我拥有的纯文本文件中读取行。我在另一个stackoverflow(Reading a plain text file in Java)上找到了你可以使用Files.lines(..)。forEach(..) 但是我实际上无法弄清楚如何使用for each函数逐行读取文本,任何人都知道在哪里查找或如何查找?

4 个答案:

答案 0 :(得分:26)

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...
        }
    }
}

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

Files.lines(Path)需要Path参数并返回Stream<String>Stream#forEach(Consumer)期望Consumer参数。因此,调用该方法,将其传递给Consumer。必须实现该对象以执行每行所需的操作。

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

答案 3 :(得分:2)

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

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

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

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

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