我从包含xml实体引用的webservice中获取了大量数据。在替换具有相应字符的那些时,我得到内存不足错误。任何人都可以举例说明如何避免这种情况吗?我在这个问题上被困了两天。
这是我的代码:
public String decodeXMLData(String s)
{
s = s.replaceAll(">",">");
System.out.println("string value is"+s);
s = s.replaceAll("<", "<");
System.out.println("string value1 is"+s);
s = s.replaceAll("&", "&");
s = s.replaceAll(""", "\"");
s = s.replaceAll("'", "'");
s = s.replaceAll(" ", " ");
return s;
}
答案 0 :(得分:4)
您应该使用SAX解析器,而不是自己解析它。
只需查看这些资源,它们也有代码示例:
答案 1 :(得分:2)
答案 2 :(得分:1)
调用五次replaceAll,您将创建五个新的String对象。总的来说,你正在使用六个字符串。这不是对字符串进行XML解码的有效方法。
我建议您使用更强大的XML编码/解码方法实现,例如Commons Lang库中包含的方法。特别是,StringEscapeUtils可以帮助您完成工作。
答案 3 :(得分:0)
显示的方法不会是内存不足错误的来源(除非您处理的字符串与剩余的空闲堆一样大)。
您可能遇到的是String.substring()
调用不分配新字符串,但创建一个字符串对象,该对象重新使用调用子字符串的字符串。如果您的代码存在读取大缓冲区并从这些缓冲区创建字符串,则可能需要使用new String(str.substring(index))
强制将字符串值重新分配到新的小字符数组中。
答案 4 :(得分:0)
您可以尝试增加JVM内存,但如果问题严重(例如,如果您尝试申请千兆字节),这只会延迟不可避免的情况。
如果你有一个字符串导致你的内存耗尽试图这样做,那一定很棒:)建议使用SAX解析器来处理它并将它打印成碎片是一个很好的建议。 或者自己将它分成较小的一部分,然后将其中的每一部分发送到一个能够达到你想要的程序并随后丢弃结果。