2017-07-27 117 views
0

我需要創建一個ZIP文件,其中包含在運行中創建並且在文件系統上沒有持久性的文件。在內存中創建ZIP文件

例如:我想在內存中創建一個SQLite數據庫,填充數據後我想將它添加到 - 尚不存在的ZIP文件中,並且要將該ZIP文件實際寫入文件系統。

我發現了幾種方法,文件將成爲檔案的內容,必須從文件系統中讀取。

實際上有一種方法可以將我想要做的事情歸檔嗎?我希望compress-commons會幫助我,但顯然他們不會。

我想念什麼?

+1

問題要求我們推薦或找到一本書,工具,軟件庫,教程或其他非現場資源,因爲它們傾向於吸引自以爲是的答案和垃圾郵件,因此無法用於Stack Overflow。相反,請描述問題以及到目前爲止解決問題所做的工作。 – JFPicard

+0

你可以創建一個臨時文件夾,將文件保存到它,壓縮並在操作後刪除它 – Lino

回答

1

如果你想壓縮的內存對象是可序列化的,那麼這很容易。

您可以採取任何可序列化的實例並將其變爲byte[]。我有一個實用的方法來做到這一點:

public static byte[] convertToBytes(Object object) throws IOException { 
    try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
      ObjectOutput out = new ObjectOutputStream(bos)) { 
     out.writeObject(object); 
     out.flush(); 
     return bos.toByteArray(); 
    } 
} 

一旦你以字節爲單位代表的那個對象,你可以使用在一個ZipOutputStream來壓縮它:

try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     GZIPOutputStream out = new GZIPOutputStream(bos);) { 
    out.write(bytes); 
    out.finish(); 
    byte[] compressed = bos.toByteArray(); // this is my compressed data 
} 

(我在這裏用gzip爲了簡單但是您也可以創建一個包含多個條目的zip文件)。

+0

感謝您的回答!使用這種方法可以在不同的文件夾中包含多個文件嗎?我確實希望有一個內存中的解決方案,因爲有些文件應該被加密,文件系統上不應該有未加密的文件版本。 – Hannes

+0

如果你的意思是在zip中有一個目錄結構,那麼是的,我相信這可以通過使用[ZipOutputStream](https://docs.oracle.com/javase/8/docs/api/index.html?java /util/zip/ZipOutputStream.html)和適當的ZipEntry對象。 –