【问题标题】:Out of memory error when trim XML修剪 XML 时出现内存不足错误
【发布时间】:2011-08-09 23:50:59
【问题描述】:

我正在做一个从 http 解析 XML 文件的程序。 并且 XML 在根标签的前面有一些空间。

所以,我需要在解析 XML 之前对其进行修剪。

这是我写的方法,

     private String trimXML(InputStream inputStream){
        Writer writer = null;
        try{
            writer = new StringWriter();
            char[] buffer = new char[Constants.BUFFER_SIZE];
            try {
                Reader reader = null;
                try {
                    reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
                    int n = 0;                
                    while ((n = reader.read(buffer)) != -1) {
                        writer.write(buffer, 0, n);
                    }
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } finally {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return writer.toString().trim();
        }catch(NullPointerException e){
            return null;
        }
    }

现在我面临一个大问题是在我请求 XML 几次后,内存不足错误是 get...

谁能给我一些建议来解决它?

【问题讨论】:

  • 你可以使用dom解析器吗? DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = dbfac.newDocumentBuilder();输入流是=???; doc = docBuilder.parse(is);
  • 为什么要修剪它?如果您从其他地方请求 xml,则在处理它时使用 SAX 解析器对其进行解析,而不必将完整的 XML 文档加载到内存中。此外,检查内存泄漏(修剪后对 XML 的引用发生了什么,它们是否由于某种原因而存在?)。
  • DOM 解析器仍然需要在解析 XML 之前完全加载并映射到内存中。 SAX 解析器允许在加载流时处理 XML。
  • squawknull,我正在使用 SAX 解析器。并且错误消息总是指出 char[] buffer = new char[Constants.BUFFER_SIZE];是通过错误。常量.BUFFER_SIZE = 819200

标签: java android xml sax xml-parsing


【解决方案1】:

为什么? XML 解析器不关心空白。如果您收到一个无法解析的 XML 文档,解决方案是修复发送者,而不是在接收者处拼凑一些东西。那样每个人都是错的。

【讨论】:

    【解决方案2】:

    您正在使用StringWriter,这意味着您继续将 XML 文件内容写入内存中的缓冲区。因此,显然,如果最后一个缓冲区保留在内存中并且尚未被垃圾回收,您将点击OutOfMemory

    顺便说一句,我不明白你的程序是如何解决你的问题的。它只是修剪整个文档。这意味着它将清除文档开头和结尾的空格。

    我对您的建议是,您不必担心空白区域并使用 StAX 或任何适合您的方式解析文档。如有必要,在解析期间修剪事物。

    但是,冲洗可能会有所帮助。因此,一个快速修复可以是这样的,

    ..
    ..
    String str = writer.toString().trim();
    writer.flush();
    return str;
    ..
    ..
    

    注意: 解析器会忽略 XML 元素周围的空格。如果您需要修剪一些属性/元素值,那就另当别论了。

    【讨论】:

      【解决方案3】:

      我可以建议您尝试解决一个已经解决的问题吗?需要自己写解析器吗?

      我的建议是不要尝试自己解析 XML,而是使用类似 Simple XML 库的库,它适用于 Android。实际上,我刚刚写了一篇博文,解释如何将它包含在您的一个项目中:you can find that here

      【讨论】:

        【解决方案4】:

        您可以使用以下方式将 InputStream 推进到“

            InputStream inputStream = new BufferedInputStream(YOUR_INPUT_STREAM);
            byte[] start = "<".getBytes("UTF-8");
            byte[] potentialStart = new byte[1];
        
            inputStream.read(potentialStart);
            while(start[0] != potentialStart[0]) {
                inputStream.mark(1);
                inputStream.read(potentialStart);
            }
            inputStream.reset();
        

        【讨论】:

          猜你喜欢
          • 2014-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-12
          • 1970-01-01
          • 2015-11-09
          • 2016-10-10
          • 2017-06-21
          相关资源
          最近更新 更多