Java 修剪XML时出现内存不足错误
我正在做一个从http解析XML文件的程序。 XML在根标记的前面有一些空间 因此,我需要在解析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
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