Java 在内存中保留一个大字符串

Java 在内存中保留一个大字符串,java,apache-camel,Java,Apache Camel,我有以下java代码: Path path = Paths.get("largefile.txt2"); if (Files.exists(path)) exchange.getIn().setBody(Files.lines(path, Charset.forName("UTF-8")).map(row -> row + System.lineSeparator()).collect(Collectors.joining()).trim()); //OOM error! 我基本

我有以下java代码:

Path path = Paths.get("largefile.txt2");
if (Files.exists(path))
   exchange.getIn().setBody(Files.lines(path, Charset.forName("UTF-8")).map(row -> row + System.lineSeparator()).collect(Collectors.joining()).trim()); 
//OOM error!
我基本上需要读取内存中的整个文件,以便根据一些搜索标准进行各种正则表达式处理和拆分。这些文件可以大到300MB-1GB

我遇到的问题是,这适用于100 MB左右的文件,但一旦达到200 MB或更多,就会出现与堆大小相关的
.setBody(…)
内存不足错误


是否有一种更有效、特别是更少内存消耗的方法?记忆对我来说比速度更重要。或者我需要重新思考我的整个方法,并逐条阅读吗?

这可能不会有太大帮助,也许可以让你处理更大的文件。通过使用以下内容,您将创建更多需要的字符串:

行+系统.lineSeparator()
.trim()
在末尾。通过将代码稍微更改为以下内容,您可能会使用更少的内存:

exchange.getIn().setBody(Files.lines(path, Charset.forName("UTF-8")).collect(Collectors.joining(System.lineSeparator())); 
虽然我不太明白为什么要逐行读取文件,然后用行分隔符再次连接行


此外,要使用regex处理大型文件,使用
Scanner
类并使用Scanner的
findWithinHorizon
方法可能会很有用,该方法具有足够大的范围以满足您的需要。当检索到匹配项时,扫描仪将自动前进。

“节省内存的方法”不要将字符串保留在内存中,不要使用正则表达式。也许解析器可以工作?也许我可以不把字符串保存在内存中,尽管这意味着重新开始。我仍然被迫使用正则表达式,因为由于各种参数,我需要“清理”数据。您指的是哪种解析器?对于大数据,您需要基于流的方法,这意味着您在任何时候都只在内存中保存一小段数据。我认为您真正的问题是必须用一个大字符串调用
setBody()
。您需要找到一种方法将输出逐段发送到
exchange