2010-09-16 33 views
0

執行最多500個XML文件轉換的最有效(性能明智)和乾淨的方式是什麼?每個Mb並從它們中取出一個單獨的字符串。所有文件都是XML,需要保持格式化等。將大量XML(文件對象)轉換爲包含所有文件內容的單個字符串

我目前正在使用XMLEventReader進行讀取,然後使用XMLEventWriter,一次讀取一個事件,並使用StringBuilder連接所有字符串結果。 然後在方法結尾將它變成一個字符串,但是由於IDE中缺少Java堆空間而導致崩潰,在500個文件之前...

謝謝!

+0

什麼你以後使用了字符串嗎?如果可能跳過這個中間字符串,也許有更高性能的方式。 – 2010-09-16 12:12:42

+0

沒有辦法改變輸出格式,因爲它被一些類似於「客戶端庫」的東西所使用,它不能被改變。儘管謝謝! – akapulko2020 2010-09-16 14:40:06

回答

1

此String對象的大小可達50 GB(50 MB * 500 * 2)。你知道的,是嗎?

當您在討論輸入文件並且想要將序列化的xml數據保存在字符串中時,您不必解析這些文件,只需將文件內容附加到您的StringBuilder即可。

假設,所有的文件都在一個文件夾中,並與公共-IO的一點幫助,這應該這樣做(...不是我的機器有4 GB的RAM上,順便說一句):

File[] files = parentFolder.list(); 
StringBuilder veryVeryBigBuilder = new StringBuilder(); 
for (File file: files) { 
    if (isXmlFile(file)) { 
     veryVeryBigBuilder.append(FileUtils.readFileToString(), encoding); 
    } 
} 
+0

數學看起來可怕:),謝謝。爲什麼* 2 BTW? – akapulko2020 2010-09-16 11:30:41

+0

你的意思是我應該只讀文件(如字節[]?)並追加到StringBuilder中? – akapulko2020 2010-09-16 11:31:09

+0

Java中的char由16位表示,String由char []表示。 – 2010-09-16 11:32:41

0

你真的需要打擾他們是XML嗎?難道你不能依次使用BufferedReader逐行讀取每個文件,只需將所有行輸出到PrintWriter

+0

我需要保留它們的XML,因爲缺少更好的單詞 - 因爲這是調用者方法期望的內容...我將檢查您建議的方法並查看它是否適用於此案例。 – akapulko2020 2010-09-16 11:29:56

+1

請注意,生成的連接文件將不會是有效的XML,因爲它不會有單個根節點。然而,你很可能會使用像XML這樣的大文件;解析它幾乎肯定會讓你失去內存。 – Qwerky 2010-09-16 11:47:56

+0

是的,這確實是調用方法提供的錯誤響應。因爲它確實解析爲XML .. :( – akapulko2020 2010-09-16 13:04:36

相關問題