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

时间:2018-11-19 12:00:02

标签: 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);
            });
        }
    }
}

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

10 1010101 15

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

String str1 = line[0];
String str2 = line[1];
String str3 = line[2];

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

createGraphe(str1,str2,str3);`

我知道我可以发送完整的String,但是当我学习Stream时,我很想知道如何提取这些信息。

谢谢。

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

您正在使用的方法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

答案 2 :(得分:0)

因为您要解决此问题并想了解在这种情况下流如何有用

  1. 读取文件(使用Java8),这将为您获取文件中的所有行:流行= Files.lines(Paths.get(filePath))
  2. 逐行读取此文件:lines.map(line-> line.split(pattern)),通过拆分该行,您将获得该行的三个部分
  3. 将获得的参数传递给函数 n:forEach(arg-> createGraphe(arg [0],arg [1],arg [2]);

如果您希望达到这个目标,我希望这能为您的答案做个详尽的说明