在工作中,我使用DefaultHandler
类解析大型XML文件。这样做,我注意到这个接口为元素名称,属性名称和值等分配了许多String
个。
由此,我考虑创建一个只执行绝对最小对象分配的XML解析器。目前我需要:
我的测试程序,用于解析http://magnatune.com/info/song_info.xml,如下所示:
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class XmlParserDemo {
public static void main(String[] args) throws IOException {
List<Map<String, String>> allSongs = new ArrayList<Map<String, String>>();
InputStream fis = new FileInputStream("d:/song_info.xml");
try {
XmlParser parser = new XmlParser(new BufferedInputStream(fis));
if (parser.element("AllSongs")) {
while (parser.element("Track")) {
Map<String, String> track = new LinkedHashMap<String, String>();
while (parser.element()) {
String name = parser.getElementName();
String value = parser.text();
track.put(name, value);
parser.endElement();
}
allSongs.add(track);
parser.endElement();
}
parser.endElement();
}
} finally {
fis.close();
}
}
}
此代码看起来比我使用XMLEventReader
的实验更好。现在唯一缺少的部分是上面代码中提到的XmlParser
类。你知道有人之前写过那段代码吗?它实际上只是我的一个宠物项目,但我很好奇旧的语句对象创建是多么昂贵值得多了。
是的,我知道LinkedHashMap
正在使用大量内存。它实际上只是我想要内存效率的解析部分。其他一切只是为了做一个简单的例子。
答案 0 :(得分:1)
“在Java中相当长的一段时间内,对象创建的成本并不昂贵”。分配通常很便宜(移动指针),垃圾收集已经走了很长的路。
我肯定使用XML API,它可以让你轻松地做你想做的事情,而不是担心过多的内存分配,除非你认为你将会推动你的性能界限。 / p>
我确定是 XML API旨在让内存占用空间特别小 - 但是你的XML文件有多大?如果它们足够小,可以很容易地融入内存,我就不用担心了......如果它们太大了,你真的需要考虑一个流API。我怀疑在一个特别有效的解析器可以适应内存的大小带,但在适用性方面,“普通”解析器不能相对较小。