Java—如何将多个列表值连接到单个字符串中,每个值的末尾都有分隔符

Java—如何将多个列表值连接到单个字符串中,每个值的末尾都有分隔符,java,join,java-8,java-stream,Java,Join,Java 8,Java Stream,如何通过在每行末尾追加“\n”将数百万个值的列表合并到单个字符串中- 输入数据在列表中: list[0] = And the good south wind still blew behind, list[1] = But no sweet bird did follow, list[2] = Nor any day for food or play list[3] = Came to the mariners' hollo! 下面的代码通过在末尾追加新行字符将列

如何通过在每行末尾追加“\n”将数百万个值的列表合并到单个字符串中-

输入数据在列表中:

   list[0] = And the good south wind still blew behind,
   list[1] =  But no sweet bird did follow,
   list[2] =  Nor any day for food or play
   list[3] =  Came to the mariners' hollo!
下面的代码通过在末尾追加新行字符将列表合并为字符串-

String joinedStr = list.collect(Collectors.joining("\n", "{", "}"));    
但是,问题是如果列表中有数百万个数据,则加入失败。我猜字符串对象无法处理数百万行,因为它太大了


请提出建议

也许你可以使用StringBuilder,它是专门为处理大型字符串而设计的。我是这样做的:

StringBuilder sb = new StringBuilder();
for (String s : list) sb.append(s).append("\n");

return s.toString();

虽然还没有测试过这段代码,但它应该可以工作

尝试组成一个巨大的字符串的问题是,在进一步使用它之前,必须将整个内容保存在内存中

如果字符串太大,无法放入内存,则只有两个选项:

增加可用内存,或 首先,避免在内存中保留一个巨大的字符串 这个字符串可能要进行进一步的处理——可能是写入数据库中的blob,或者可能是HTTP响应的主体。建造它不是为了好玩

更可取的做法可能是向某种流写入数据,这种流可能是一次只能读取一个字符的实现。消费者可以选择基于分隔符进行缓冲,如果他们知道您发送的内容的上下文,或者他们可以等到拥有整个内容

最好使用支持的工具,以便在消费者速度太慢时暂停书写


具体情况取决于您试图完成的任务。

您会遇到什么错误或异常?如果是与垃圾收集器相关的内容,请尝试为VM提供更多内存。内存不足的不是字符串,而是您的内存不足。数以百万计的字符串需要大量的空格,因为上面的代码使用return语句,而不是将其存储在字符串变量中。如果不是返回,字符串var=s.toString;它不起作用。Jvm内存大小超过。这与加入收集器的内部操作没有什么不同。@ShakthiRaj字符串对象所需的内存不会更改,无论是返回引用还是将其存储到局部变量中。因此,字符串内存大小是否取决于Jvm堆内存。?如果是这种情况,java处理依赖于jvm内存。因为我正试图为数百万条生产线做这个过程。有没有其他方法可以在不改变内存的情况下实现这一点,即使它需要处理至少10万个内存lines@ShakthiRaj我不明白你在问什么。当然,要在内存中保存一个大字符串,需要有足够的内存。如果这个例子恰好在一个测试中起作用,但在一个微妙的、不相关的更改后失败,这意味着字符串可能几乎无法放入内存中,但是由于您希望做的事情不仅仅是在内存中有一个字符串,因此无法添加更多内存。