【问题标题】:How to implement SAX handler's character() function for minimal memory usage?如何实现 SAX 处理程序的 character() 函数以最小化内存使用?
【发布时间】:2011-03-06 23:06:09
【问题描述】:

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

我只是把这段代码放在一起让它工作,这样我就可以测试我的解析器的其余部分,但这需要优化。

关于如何实现这一点以使用尽可能少的内存有什么建议吗?

【问题讨论】:

    标签: java android optimization string sax


    【解决方案1】:

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

    【讨论】:

    • 你知道是否有办法从字符串生成器中修剪空格(/u0020 及以下)?现在我正在使用 builder.toString().trim() 大部分时间使用双倍内存。
    • 对不起,我的意思是在组装完成后修剪最后的字符串。这将单独修剪每个段,从而消除一些有效的空白。假设我的整个字符串是“\n Code Fusion \n”,但我把它分成两块:“\n Code”和“Fusion \n”。您的代码将以“CodeFusion”而不是“Code Fusion”结尾。不过我也确实首先想到了这种方法,所以很荣幸
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 2012-04-29
    • 2013-03-02
    • 1970-01-01
    • 2010-10-17
    • 2021-02-06
    相关资源
    最近更新 更多