2014-12-17 3 views
2

как показано ниже, чтобы прочитать каждую строку и выполнить конкатенацию на основе списка listValues.Использование одиночного StringBuilder - throws OutofmemeoryException

BufferedReader br = null; 
StringBuilder sb = new StringBuilder(""); 
InputStream in = new FileInputStream(new File(file)); 
br = new BufferedReader(new InputStreamReader(in), 102400); 
for (String input; (input= br.readLine()) != null;) { 
    for (int i = 0; i < listValues.size(); i++) { 
     sb.append(input.substring(1, 5)); 
    } 
    map.put(sb.toString(), someOtherValue); 
    sb.delete(0, sb.length()); 
} 

Использование одного и того же StringBuilder для каждой итерации путем установки удаления содержимого каждый раз. Все еще бросает

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
at java.lang.String.substring(Unknown Source) 

Какая ошибка я сделал?

Редактировать: Я исправился согласно Предложение Bathsheba. Но теперь бросает,

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
at java.util.Arrays.copyOfRange(Unknown Source) 
at java.lang.String.<init>(Unknown Source) 
at java.io.BufferedReader.readLine(Unknown Source) 
at java.io.BufferedReader.readLine(Unknown Source) 

на for (String input; (input= br.readLine()) != null;) Что сейчас проблема?

+0

возможно дубликат [вопрос утечки памяти об использовании метода Java подстроки] (HTTP: // StackOverflow. com/questions/17359047/memory-leak-issue-on-use-java-substring-method) – Smutje

+0

'input.substring (1, 5)' является виновником ... В более старых версиях Java массив размера исходного String создается для подстроки .. в основном, слишком много объектов. проверьте [this] (http://stackoverflow.com/questions/14161050/java-string-substring-method-potential-memory-leak) – TheLostMind

+0

@TheLostMind К сожалению! мог бы посоветовать мне, как с этим справиться. Я повторяю те же сотни миллионов раз – Harbinger

ответ

2

Использование substring в плотной петле не рекомендуется, так как оно создаст много строк, которые не могут быть собраны в мусор.

Решение в вашем случае будет использовать charAt и добавить char S к экземпляру StringBuilder:

for (int j = 1; j <= 5; ++j){ /*ToDo - check the loop bounds*/ 
    sb.append(input.charAt(j)); /*StringBuilder has an overload for `char` insertion*/ 
} 
+0

Исправлено по вашему. Но теперь выбрасывается исключение в потоке «main» java.lang.OutOfMemoryError: Java куча пространства \t at java.util.Arrays.copyOfRange (Неизвестный источник) \t at java.lang.String. (Неизвестный источник) \t at java.io.BufferedReader.readLine (Неизвестный источник) at java.io.BufferedReader.readLine (Неизвестный источник) в контуре цикла for. – Harbinger

Смежные вопросы