Как реализовать символьную функцию обработчика SAX для минимального использования памяти? - PullRequest
2 голосов
/ 06 марта 2011

Я внедряю парсер java SAX в своем приложении для Android.

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

Это моя текущая (и довольно неэффективная, я знаю) реализация функции символа () DefaultHandler.

String currentText = "";

    @Override
public void characters(char[] ch, int start, int length)
{
    if(currentText.length() > 0)
    {
        currentText = currentText.concat(new String(ch, start, length));
    }else
    {
        //Takes half as much memory as concating to empty string
        currentText = new String(ch, start, length);
    }
}

По сути, эта функция вызывается, когда SAXвстречает текст внутри элемента.Однако важно отметить, что весь текст не гарантируется для одновременного анализа, поэтому новые символы должны быть добавлены к любому тексту, находящемуся в текущий момент в currentText (обратите внимание, что currentText установлен в «» в конце каждого элемента).

Я просто скомбинировал этот код, чтобы он работал, чтобы я мог протестировать остальную часть моего анализатора, но это необходимо оптимизировать.

Любые предложения о том, как я могу реализовать это, чтобы использовать как можно меньшепамять как можно?

1 Ответ

9 голосов
/ 06 марта 2011

Используйте StringBuilder .

StringBuilder currentText = new StringBuilder();

@Override
public void characters(char[] ch, int start, int length)
{
   currentText.append(ch, start, length);
}

Позже вы можете получить полный текст, позвонив currentText.toString().

Обновить доимитировать обрезку:

@Override
public void characters(char[] ch, int start, int length)
{
   if(length == 0) return;
   int end = (start + length) - 1;
   while(char[start] <= '\u0020')
   {
       if(start == end) return;
       start++;
       length--;
   }
   while(char[end] <= '\u0020')
   {
       if(end == start) return;
       length--;
       end--;
   }
   currentText.append(ch, start, length);
}
...