Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 修剪XML时出现内存不足错误_Java_Android_Xml_Sax_Xml Parsing - Fatal编程技术网

Java 修剪XML时出现内存不足错误

Java 修剪XML时出现内存不足错误,java,android,xml,sax,xml-parsing,Java,Android,Xml,Sax,Xml Parsing,我正在做一个从http解析XML文件的程序。 XML在根标记的前面有一些空间 因此,我需要在解析XML之前对其进行修剪 这是我写的方法 private String trimXML(InputStream inputStream){ Writer writer = null; try{ writer = new StringWriter(); char[] buffer = new char[Constan

我正在做一个从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


有谁能给我一些建议来解决这个问题吗?

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

顺便说一下,我不明白你的程序是如何解决你的问题的。这仅仅是对整个文件的删减。这意味着它将清除文档开头和结尾的空白

我给您的建议是,您不必担心空白,也不必使用StAX或任何适合您的方法来解析文档。必要时,在解析过程中修剪对象

不过,冲洗可能会有所帮助。因此,一个快速解决方案可以是:

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

NB:XML元素周围的空格将被解析器忽略。如果需要修剪某些属性/元素值,那就另当别论了。

您使用的是
StringWriter
,这意味着您将继续将XML文件内容写入内存中的缓冲区。因此,很明显,如果最后一个缓冲区留在内存中,并且还没有被垃圾收集,您将点击
OutOfMemory

顺便说一下,我不明白你的程序是如何解决你的问题的。这仅仅是对整个文件的删减。这意味着它将清除文档开头和结尾的空白

我给您的建议是,您不必担心空白,也不必使用StAX或任何适合您的方法来解析文档。必要时,在解析过程中修剪对象

不过,冲洗可能会有所帮助。因此,一个快速解决方案可以是:

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

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

为什么?XML解析器不关心空格。如果您收到一个没有解析的XML文档,那么解决方案是修复发送方,而不是在接收方混淆某些东西。这样每个人都错了。为什么?XML解析器不关心空格。如果您收到一个没有解析的XML文档,那么解决方案是修复发送方,而不是在接收方混淆某些东西。这样每个人都是错的。

我可以建议你可能正在试图解决一个已经解决的问题吗?您需要自己编写解析器吗


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

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


我的建议是不要自己尝试解析XML,而是使用一个类似Android上的库。实际上,我刚刚写了一篇博客文章,解释了如何将其包括在您的一个项目中:。

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