【问题标题】:Effecient way to convert a stream of Strings into grouped list of strings将字符串流转换为字符串分组列表的有效方法
【发布时间】:2016-09-21 18:01:26
【问题描述】:

我有一个函数可以接收Stream<String>。此流表示文件中的行(由Files.lines(somePath) 调用)。文件本身实际上就是将许多文件串联成一个文件,如下所示:

__HEADER__ # 用于文件 1 数据 更多数据 ... __HEADER__ # 文件 2 从这里开始 还有一些数据... ...

我需要将流转换成文件系统上的多个物理文件。

我尝试了简单的方法,类似于:

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


【解决方案1】:

这扼杀了流的整个概念。

试试 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
        }
    });

【讨论】:

  • 是的,它不适合流的想法,但我能够在此基础上很好地工作,而且它比重写底层代码更快,而且它表现也非常好。 :)
  • 不是我个人批评你,无论如何!如果每个人都知道所有的解决方案,就不会开始使用 StackOverflow。
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多