如何使用Java Stream逐行读取文件

zak*_*zak 9 java string java-8 java-stream

我正在尝试逐行读取一个长文件,并尝试同时从该行中提取一些信息.

这是我正在做的一个例子:

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

public class ReadFile_Files_Lines {

    public static void main(String[] pArgs) throws IOException {
        String fileName = "c:\\temp\\sample-1GB.txt";
        File file = new File(fileName);

        try (Stream<String> linesStream = Files.lines(file.toPath())) {
            linesStream.forEach(line -> {
                System.out.println(line);
            });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我文件中的一行分为三部分:

10 1010101 15
Run Code Online (Sandbox Code Playgroud)

我希望每次都阅读这三个信息.喜欢 :

String str1 = line[0];
String str2 = line[1];
String str3 = line[2];
Run Code Online (Sandbox Code Playgroud)

如果我不将流转换为集合,我正在寻找的解决方案会更好.我将使用这3个String来创建图形数据结构,如:

createGraphe(str1,str2,str3);`
Run Code Online (Sandbox Code Playgroud)

我知道我可以发送完整的字符串,但是因为我正在学习Stream我很想知道如何提取这些信息.

谢谢.

Pus*_*shi 7

您正在使用的方法lines()已经达到了您期望的效果。

Java 8 在 Files 类中添加了一个新方法lines(),可用于在 Java 中逐行读取文件。此方法的优点在于,它将文件中的所有行作为字符串流读取,并在消耗流时延迟填充。因此,如果您有一个巨大的文件,并且只读取前 100 行,则其余行将不会加载到内存中,从而获得更好的性能。

这与Files.readAllLines()方法(将所有行读入列表)略有不同,因为此方法仅在 Stream 上调用终端操作时才延迟读取文件forEach()count()例如 等。通过使用count()方法,您实际上可以计算文件中的行数或通过过滤空行来获得空行数。

参考:https://javarevisited.blogspot.com/2015/07/3-ways-to-read-file-line-by-line-in.html


dan*_*niu 7

您可以通过拆分每一行映射到数组,然后调用所需的方法.

Files.lines(filePath)
    .map(l -> l.split(" "))
    .forEach(a -> createGraphe(a[0], a[1], a[2]));
Run Code Online (Sandbox Code Playgroud)