我有一个会收到Stream<String>
的函数。此流表示文件中的行(由Files.lines(somePath)
调用)。文件本身实际上是将许多文件连接成一个文件,如下所示:
__HEADER__ # for file 1 data more data ... __HEADER__ # file 2 starts here some more data... ...
我需要将流转换为文件系统上的多个物理文件。
我尝试过简单的方法,其中包括:
String allLinesJoined = lineStream.collect(Collectors.joining());
// This solution seems to get stuck on the line above ^
String files[] = allLinesJoined.split("__HEADER__");
for (fileStr : files)
{
// This function will write each fileStr to a separate file
// (filename is determined by contents of fileStr)
writeToPhysicalFile(fileStr);
}
但是输入文件约为300 MB(并且可能会变大),这个解决方案似乎停留在第一行。如果我有更多记忆,也许它会完成......?
有没有更好的方法来做到这一点,如果我的起点是Stream<String>
,或者我应该开始进行其他更改,以便这段代码可以逐行读取文件,而不使用流API?
(在这些文件的上下文中,行的顺序很重要)
TL;博士
我需要将一个代表Stream<String>
的大文件转换为许多小文件。每个小文件都以__HEADER__
开头,后面是所有行,直到下一个__HEADER__
。当前库使用流来提供文件,但是甚至值得尝试使用流来执行此操作,或者如果我更改库以提供非流功能,我的生活会更轻松吗?
答案 0 :(得分:2)
这会杀死整个流的想法。
尝试forEach():
Stream<String> lineStream = Files.lines(Paths.get("your_file"));
lineStream.forEachOrdered((s) -> {
if ("HEADER".equals(s)) {
// create new file
}
else {
// append to this file
}
});