【发布时间】:2016-09-21 18:01:26
【问题描述】:
我有一个函数可以接收Stream<String>。此流表示文件中的行(由Files.lines(somePath) 调用)。文件本身实际上就是将许多文件串联成一个文件,如下所示:
我需要将流转换成文件系统上的多个物理文件。
我尝试了简单的方法,类似于:
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;dr
我需要将一个表示为Stream<String> 的大文件转换为许多小文件。每个小文件都以__HEADER__ 和之后的所有行开头,直到下一个__HEADER__。当前库使用流来提供文件,但是否值得尝试使用流来执行此操作,或者如果我将库更改为提供非流功能,我的生活会更轻松吗?
【问题讨论】:
-
基于相互矛盾的答案,您的最终目标可能会有些混乱(至少我很困惑)。我理解问题,但不是所需的解决方案
-
@ChrisThompson:我也刚刚意识到这一点,我认为我的最新编辑更清楚了。
-
流真的不是为此而设计的。它们专为不关心流如何单独分块的操作而设计。
标签: java java-stream