2013-06-03 228 views
0

我使用一種方法使用XMLOutputter,FileWriter和BufferedWriter創建xml文件。它工作正常,但XML文件可以更大(超過10兆),我與他們很多。將文件轉換爲xml,然後將它們添加到zip

我想找到一種方法直接將文件寫入壓縮文件,保持文件體系結構。我使用的方法會將不同的xml文件依次添加到主文件夾中。

我想改變我的方法,所以它不會刪除已存檔的文件,只是將它們添加到它。

隨着我一直在研究如何做到這一點,我明白我需要從現有的存檔中獲取文件,將新文件附加到該文件並再次壓縮。我想用zipInputStream和zipOutputStream來做到這一點。

這個問題的接受答案Java appending files into a zip是我想要做的最好的例子,但第一次我會使用該方法,zip文件不存在,我不會在一個文件中添加多個文件時間到檔案。我想我可以通過一個if語句來解決這個問題,該語句將檢查zip文件是否存在,並在方法參數中使用file而不是file []。

我面臨的主要問題是找到一種方法來創建一個xml文件,而無需將其寫入磁盤並將其壓縮到zip文件。

我的猜測是創建一個臨時文件並在壓縮完成後刪除它。

有關我如何實現這一點的任何想法?

這裏是我的代碼示例:

XMLOutputter objOut = new XMLOutputter(); 
objOut.setFormat(Format.getPrettyFormat()); 
File objBaseDirectory = new File(m_strFolder); // folder where the xml file will be written but not main xml folder 
if(!objBaseDirectory.exists()) 
{objBaseDirectory.mkdirs();} 
FileWriter objFileWriter = new FileWriter(m_strFile); // xml file name 
BufferedWriter objBuffer = new BufferedWriter(objFileWriter); 
objOut.output(m_objectToWrite.toXml(0), objBuffer); // source file to convert to xml 

這工作得很好,並寫入XML文件到正確的文件夾。

任何人都可以幫我解決這個問題嗎?

回答

1

這個概念沒有太大的不同。 您的XMLOutputter將xml數據寫入Writer或OutputStream。 在您的代碼中,它正在寫入一個以磁盤上的文件結尾的文件。 您可以提供另一個以zip結尾的輸出流。

,如果你看看你給有關附加文件壓縮的​​例子的代碼,你看到以下內容:

ZipOutputStream out = new ZipOutputStream(new FileOutputStream(source)); 
for(int i = 0; i < files.length; i++){ 
    InputStream in = new FileInputStream(files[i]); 
    out.putNextEntry(new ZipEntry(path + files[i].getName())); 
    for(int read = in.read(buffer); read > -1; read = in.read(buffer)){ 
     out.write(buffer, 0, read); 
    } 
    out.closeEntry(); 
    in.close(); 
} 

... 

out.close(); 

發生了什麼? 打開一個zip輸出流,命名爲「out」。 然後在文件上執行循環。 對於每個文件,獲取輸入流以讀取名爲「in」的文件字節。 然後一個條目被添加到zip輸出流中。添加它準備輸出流以接收該條目的數據。在那之後,輸入流被寫入輸出流,關閉該條目(爲下一個文件在循環中的下一個文件準備),最後zip輸出流被關閉。

好吧,您所要做的就是遍歷您的文檔(當前位於「m_objectToWrite」)而不是磁盤文件。然後,不要將輸入流複製到輸出流,而是要求您的xml輸出器將文檔寫入輸出流。幾乎是「在邏輯世界中,字節從輸入到輸出」的相同概念。但在這裏,不是手動做這個副本,而是一些特殊的對象爲你做。xml輸出器。

我會離開你,讓一切正常工作,就像一個好的路徑和文件存儲在zip中。但假設m_objectToWrite是一個「文檔」對象,工作代碼的框架可以是:(使用從上方和從你的代碼在這個職位代碼:

ZipOutputStream out = new ZipOutputStream(new FileOutputStream(source)); 
for(Document m_objectToWrite : MY_DOCUMENTS_LIST){ 
    out.putNextEntry(new ZipEntry(path + GIVE_NAME_BASED_ON_CURRENT_DOCUMENT)); 
    objOut.output(m_objectToWrite.toXml(0), out); 
    out.closeEntry(); 
} 

... 

out.close(); 
+0

大,非常感謝我現在好理解並最終能夠解決這個問題。 – jpl

相關問題