如何实现SAX处理程序的character()函数以最小化内存使用?

时间:2011-03-06 05:15:51

标签: java android optimization string sax

我正在Android应用中实现一个java SAX解析器。

我已经完成了所有工作,但我正在尝试优化一个可以吸收更多内存的小块。

这是我目前(我知道效率很低)的DefaultHandler character()函数的实现。

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在每个元素的末尾设置为“”)。 / p>

我只是把这些代码放在一起使它工作,所以我可以测试我的解析器的其余部分,但这需要进行优化。

有关如何实现此操作以尽可能少使用内存的任何建议?

1 个答案:

答案 0 :(得分:9)

使用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);
}