Я изо всех сил пытаюсь выяснить, что вызывает эту ошибку OutofMemory.Увеличение объема доступной памяти не является решением, потому что моей системе не хватает памяти.Вместо этого я должен найти способ переписать свой код.
Я упростил свой код, чтобы попытаться изолировать ошибку.Пожалуйста, взгляните на следующее:
File[] files = new File(args[0]).listFiles();
int filecnt = 0;
LinkedList<String> urls = new LinkedList<String>();
for (File f : files) {
if (filecnt > 10) {
System.exit(1);
}
System.out.println("Doing File " + filecnt + " of " + files.length + " :" + f.getName());
filecnt++;
FileReader inputStream = null;
StringBuilder builder = new StringBuilder();
try {
inputStream = new FileReader(f);
int c;
char d;
while ((c = inputStream.read()) != -1) {
d = (char)c;
builder.append(d);
}
}
finally {
if (inputStream != null) {
inputStream.close();
}
}
inputStream.close();
String mystring = builder.toString();
String temp[] = mystring.split("\\|NEWandrewLINE\\|");
for (String s : temp) {
String temp2[] = s.split("\\|NEWandrewTAB\\|");
if (temp2.length == 22) {
urls.add(temp2[7].trim());
}
}
}
Я знаю, что этот код, вероятно, довольно запутанный :) У меня есть множество текстовых файлов в каталоге, который указан в args [0].Эти текстовые файлы были созданы мной.Я использовал | NEWandrewLINE |чтобы указать новую строку в текстовом файле, и | NEWandrewTAB |указать новый столбец.В этом фрагменте кода я пытаюсь получить доступ к URL каждой сохраненной строки (которая находится в 8-м столбце каждой строки).Итак, я прочитал весь текстовый файл.Строка разделена на | NEWandrewLINE |и затем снова разбить строку на подстроки в | NEWandrewTAB |.Я добавляю URL-адрес в LinkedList (называемый «urls») со строкой: urls.add (temp2 [7] .trim ())
Теперь результат выполнения этого кода:
Doing File 0 of 973 :results1322453406319.txt
Doing File 1 of 973 :results1322464193519.txt
Doing File 2 of 973 :results1322337493419.txt
Doing File 3 of 973 :results1322347332053.txt
Doing File 4 of 973 :results1322330379488.txt
Doing File 5 of 973 :results1322369464720.txt
Doing File 6 of 973 :results1322379574296.txt
Doing File 7 of 973 :results1322346981999.txt
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2882)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:572)
at java.lang.StringBuilder.append(StringBuilder.java:203)
at Twitter.main(Twitter.java:86)
Где основная линия 86 относится к строке builder.append (d);в этом примере.
Но я не понимаю, что если я закомментирую строку urls.add (temp2 [7] .trim ());Я не получаю никакой ошибки.Таким образом, ошибка, по-видимому, вызвана переполнением связанного списка URL-адресов.Но почему тогда сообщаемая ошибка относится к StringBuilder?