【发布时间】:2018-07-04 05:20:33
【问题描述】:
我得到一个 java.lang.OutOfMemoryError: Java heap space。我不确定我做错了什么。这是我的代码:
StringBuffer finalString = new StringBuffer();
try {
BufferedReader br = new BufferedReader(new FileReader("collegeData 2.txt"));
StringBuffer returnFile = new StringBuffer();
returnFile.append(br.readLine() + br.readLine());
ArrayList<String> allData = new ArrayList<String>();
boolean completedFirstSection = false;
int count = 2;
String addString = "";
String nextLine;
while ((nextLine=br.readLine())!=null) {
if(count < 990) {
addString += nextLine;
count++;
} else {
String sub = nextLine.substring(16);
sub = sub.substring(0, sub.length());
addString = sub + ":{" + nextLine + "," + addString.substring(0, addString.length()-2) + br.readLine();
br.readLine();
allData.add(addString);
count = 2;
}
}
allData.add("}}]");
System.out.println("here");
System.out.println(returnFile.toString());
finalString = returnFile;
br.close();
} catch (IOException e) {
e.printStackTrace();
}
collegeData 2.txt 为 44.2 mb,它是一个 json 文件。这是我的错误信息。
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.base/jdk.internal.misc.Unsafe.allocateUninitializedArray(Unsafe.java:1250)
at java.base/java.lang.invoke.StringConcatFactory$MethodHandleInlineCopyStrategy.newArray(StringConcatFactory.java:1605)
at java.base/java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(DirectMethodHandle$Holder)
at java.base/java.lang.invoke.LambdaForm$BMH/754666084.reinvoke(LambdaForm$BMH)
at java.base/java.lang.invoke.LambdaForm$MH/801197928.linkToTargetMethod(LambdaForm$MH)
at RunnerCombined.main(RunnerCombined.java:31)
RunnerCombined.java:31 是上面的 'addString += nextLine'。
提前感谢您的帮助!
【问题讨论】:
-
不确定这是否是错误的原因,但您应该真正使用
StringBuilder或StringBuffer(如果需要考虑同步),而不是String用于addString。Strings 是不可变的,因此每次追加都需要分配一个新对象并进行复制。 -
哦,说得好!让我试一试,我是否应该创建一个字符串缓冲区,然后每次都清除该字符串缓冲区?
标签: java bufferedreader stringbuffer