Java内存不足错误发生在读取一个文件时,该文件只有一行非常长



我们的应用程序需要用一行读取一个文件,而这一行包含大量数据。我们正在做的是,从文件中读取行并将其存储在字符串中,然后用-标记字符串并存储到列表中。从该列表中可以查看一些条目。

方法如下

public bollean checkMessage(String filename){
boolean retBool = true;
LinkedList tokenList;
int size;
String line = "";
try {
    File file = new File(filename);
    FileInputStream fs = new FileInputStream(file);
    InputStreamReader is = new InputStreamReader(fs);
    BufferedReader br = new BufferedReader(is);
    while ((line = br.readLine()) != null) {
        line.trim();
        tokenList = tokenizeString(line, "-");
        if (tokenList == null) {
            retBool = false;
            resultMsg = "Error in  File.java "                  
        }
        if (retBool) {
                retBool = checkMessagePart(tokenList);
        }
   }
}

错误发生在第行,而((line=br.readLine())!=空)

错误为

Caused by: java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2367)
    at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130)
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:114)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:535)
    at java.lang.StringBuffer.append(StringBuffer.java:322)
    at java.io.BufferedReader.readLine(BufferedReader.java:363)
    at java.io.BufferedReader.readLine(BufferedReader.java:382)

实际上,增加堆大小并没有起到作用。尝试读取的文件大小超过1gb。也尝试以字节块的形式读取,但当将读取的数据添加到StringBuilder或列表时,将再次生成MemoryError

如果问题是无法将文件读取为字符串,则不要执行此操作。请使用其他方法逐个标记地读取。简单的方法是使用带有正确分隔符的Scanner(在您的情况下为"-")。如果您发现它的性能不足,您可以求助于实现自己版本的BufferedReader,在该版本中,"行"由该字符分割,而不是由正常值分割。

最新更新