我正在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>
我只是把这些代码放在一起使它工作,所以我可以测试我的解析器的其余部分,但这需要进行优化。
有关如何实现此操作以尽可能少使用内存的任何建议?
答案 0 :(得分:9)
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);
}