Java Buffered reader 堆空间不足

标签 java string xml-parsing bufferedreader

我正在尝试解析一个非常大的文件(~1.2 GB)。文件的某些行大于允许的最大字符串大小。

        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) {

任何人都可以针对这种情况提出任何替代方法吗?

最佳答案

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

解决方案:不要。一次读取一个 block ,甚至一次读取一个字符:无论文件的未声明结构决定什么。

关于Java Buffered reader 堆空间不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31326770/

相关文章:

Java方法在字符串中查找字母集不特定于字母序列?

java - 解析 BPEL 文件以提取 Activity + XPath

xml - 使用 XSD 一个元素对另一个元素的依赖性

php - DOMElement 类的对象无法转换为字符串

java - 为什么这个 for 数组循环使用 new ARRAY.length-1 ?

java - 如何在分水岭的分割中添加坐标?

java - 不支持的 major.minor 版本 52.0 强制门户

java - 为什么 Java 8 预热速度较慢

java - 当 Java 编译器在一行中看到许多字符串连接时会发生什么?

当 strlen 产生段错误时来自 GetString() 的 C 字符串