当前位置: 首页 > 知识库问答 >
问题:

防止在读取大型文本文件时超出堆

孔俊捷
2023-03-14

我正在写一个小程序,可以处理大的(最多无限个)文本文件。处理过程将相当简单(将部分内容修剪并处理成单独的字符串,然后打印出来)。然而,由于数据的长度可能是无限的,我可能会遇到超过堆的问题。我想到的第一个解决方案是使用流来处理数据。然而,Files类中的lines()方法只能将文本分成行。我的线条也可以无限长!

我遇到的另一个解决方案是使用scanner useDelimiter方法:

Scanner input=new Scanner("file.txt");
input.useDelimiter(" "); 

while(input.hasNext()){
  System.out.println(input.next());
} 

这种方法会阻止Java一次读取所有文件,实际上允许我逐字处理文件而不超过堆吗?

Java中是否有一些更有效的解决方案(对于初学者来说不是太复杂)?

共有1个答案

刘意
2023-03-14

我试图模拟您的堆错误,但无法。使用我可以生成的数据,您的方法也可以正常工作。

然而,如果您正在寻找一种基于流的方法,那么这应该是可行的<代码>扫描仪。tokens()提供一个

try( Scanner input = new Scanner( new File( "file.txt" ) ); ){
    input.useDelimiter( " " );
    input.tokens().forEach( m -> System.out.println( m ) );
}
catch( FileNotFoundException e ){
    e.printStackTrace();
}

 类似资料:
  • 问题内容: 有关此目标背后的动机(以及我为实现该目标所做的努力)的更多详细信息,请查看我的上一个问题。我决定完全以一个新问题提出这个问题,因为我认为它已经发展到足以值得这样做了。作为总结,我打算将JDOM与NIO结合使用,以便: 在xml文件上获得排他文件锁定。 将文件读入对象。 进行任意更改(锁定仍处于活动状态!)。 将更改写回到xml文件。 释放文件锁。 但是,我遇到的问题是,将xml文件读入

  • 我使用以下两段代码来读取一个大文件。 这使用: 对我错过的东西的想法?即使使用了'read()'方法,BufferedReader也应该比从FileReader读取更好的性能吗?

  • 我在用图书馆 我在努力 库,但无法将其转换为工作簿 注意:在最终结果中,我希望返回XSSFWorkbook 上面的代码会内存溢出,任何帮助都将提前感谢

  • 问题内容: 我正在尝试通过Apache POI读取大型Excel文件xlsx,例如40-50 MB。我的内存不足异常。当前的堆内存为3GB。 我可以阅读较小的excel文件,没有任何问题。我需要一种方法来读取大型excel文件,然后通过Spring excel视图将它们作为响应返回。 我首先开始使用, 但是每个Apache POI API的使用成本很高,因此我改用OPC封装方式,但效果仍然相同。我

  • 我需要生成一个非常大的文本文件。每一行都有一个简单的格式: 假设我要生成一个有1亿行的文件。我尝试了两种方法,令人惊讶的是,它们给出了非常不同的时间表现。 > 用于100m以上的循环。在每个循环中,我生成的短字符串,然后将其写入文件。这种方法需要很多时间。 请注意: 方法2有2个循环,而不是1个循环。 对于方法1和方法2,我都在循环中写入文件。因此这两个步骤必须相同。 因此方法1必须花费更少的时间

  • 我正试图读/写一个巨大的文本文件。但当我尝试这样做时,我得到了错误: 我的代码如下: 我尝试添加一个计数器(count),这样它可以在读取一定数量的行后刷新缓冲区。它不起作用。我知道计数器工作不正常。在执行“while”循环的特殊次数后,它不会变为零。我在while循环之前和之后添加了一个“for”循环来清空计数器,但效果不太好。 有什么建议吗?