Java缓冲读取器耗尽堆空间

时间:2015-07-09 19:39:51

标签: java string xml-parsing bufferedreader

我试图解析一个非常大的文件(~1.2 GB)。文件的某些行大于允许的最大String大小。

        FileReader fileReader = new FileReader(filePath);
        BufferedReader bufferedReader = new BufferedReader(fileReader);

        while ((line = bufferedReader.readLine()) != null) {
              //Do something
        }

        bufferedReader.close();

错误:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3332)
    at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:137)
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:121)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:569)
    at java.lang.StringBuffer.append(StringBuffer.java:369)
    at java.io.BufferedReader.readLine(BufferedReader.java:370)
    at java.io.BufferedReader.readLine(BufferedReader.java:389)
    at sax.parser.PrettyPrintXML.format(PrettyPrintXML.java:30)

第30行:

while ((line = bufferedReader.readLine()) != null) {

任何人都可以为此案例提出任何替代方案。

3 个答案:

答案 0 :(得分:2)

您在没有行的文件上使用readLine()。因此它尝试将整个文件作为单行读取。这不会扩展。

解决方案:不要。一次读取一个块,或者一次读取一个字符:无论文件的未说明结构是什么,都可以。

答案 1 :(得分:0)

我相信最大字符串字符长度是2 ^ 31-1 [2,147,483,647]和1.2GB txt文件(假设是一个txt文件)可以存储大约1,200,000,000个字符。为什么需要读取所有数据?你用它做什么用的?您可以将文件拆分为多个文件,或者将其作为较小的字符串进行读取和解析。需要更多信息。

答案 2 :(得分:-1)

您可以使用Apache commons IO:
https://commons.apache.org/proper/commons-io/description.html

示例:

 InputStream in = new URL( "http://commons.apache.org" ).openStream();
 try {
   System.out.println( IOUtils.toString( in ) );
 } finally {
   IOUtils.closeQuietly(in);
 }