在工作中,我使用DefaultHandler
類解析大型XML文件。這樣做,我注意到這個接口爲元素名稱,屬性名稱和值等分配了許多String
。沒有過多內存分配的Java XML解析器
從那以後,我開始考慮創建一個只分析絕對最小值的XML解析器。目前,我需要:
- 一個StringBuilder的建築元素名,屬性名等
- 一個CharsetDecoder轉化成字節字符。
我的測試程序,用於解析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
s正在使用很多內存。這真的只是我想要的內存效率的解析部分。其他一切只是爲了舉一個簡單的例子。
你想解決什麼問題?性能差,解析器使用太多的內存,還是別的?如果是性能/內存使用,首先需要進行配置文件明智的選擇,然後花費時間在預測上編寫新的解析器,以便對象分配非常昂貴。 – mdma 2010-07-14 22:16:58
我真的沒有問題,它更像是一個謎題。我想看看我能夠避免內存分配。這並不是說我現在需要它,但也許以後,當我真的需要它時,我可以使用我在這裏學到的東西。 – 2010-07-15 05:14:43