将字符串流转换为字符串分组列表的有效方法

时间:2016-09-21 18:01:27

标签: java java-stream

我有一个会收到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__。当前库使用流来提供文件,但是甚至值得尝试使用流来执行此操作,或者如果我更改库以提供非流功能,我的生活会更轻松吗?

1 个答案:

答案 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
        }
    });