我们的应用程序需要用一行读取一个文件,而这一行包含大量数据。我们正在做的是,从文件中读取行并将其存储在字符串中,然后用-标记字符串并存储到列表中。从该列表中可以查看一些条目。
方法如下
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,在该版本中,"行"由该字符分割,而不是由正常值分割。