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

Cod*_*ile 2 java string optimization android 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上,当SAX遇到元素内的文本时,会调用此函数.重要的是要注意,整个文本不能保证一次解析,因此必须将新字符附加到当前currentText中的任何文本(请注意,currentText在每个元素的末尾设置为"").

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

关于如何实现这个以尽可能少使用内存的任何建议?

The*_*ter 9

使用StringBuilder.

StringBuilder currentText = new StringBuilder();

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

稍后您可以通过致电获取全文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);
}
Run Code Online (Sandbox Code Playgroud)