我正在尝试逐行读取一个长文件,并尝试同时从该行中提取一些信息。
以下是我正在做的事的例子:
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时,我很想知道如何提取这些信息。
谢谢。
答案 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)
因为您要解决此问题并想了解在这种情况下流如何有用
如果您希望达到这个目标,我希望这能为您的答案做个详尽的说明