我需要創建一個ZIP文件,其中包含在運行中創建並且在文件系統上沒有持久性的文件。在內存中創建ZIP文件
例如:我想在內存中創建一個SQLite數據庫,填充數據後我想將它添加到 - 尚不存在的ZIP文件中,並且要將該ZIP文件實際寫入文件系統。
我發現了幾種方法,文件將成爲檔案的內容,必須從文件系統中讀取。
實際上有一種方法可以將我想要做的事情歸檔嗎?我希望compress-commons
會幫助我,但顯然他們不會。
我想念什麼?
我需要創建一個ZIP文件,其中包含在運行中創建並且在文件系統上沒有持久性的文件。在內存中創建ZIP文件
例如:我想在內存中創建一個SQLite數據庫,填充數據後我想將它添加到 - 尚不存在的ZIP文件中,並且要將該ZIP文件實際寫入文件系統。
我發現了幾種方法,文件將成爲檔案的內容,必須從文件系統中讀取。
實際上有一種方法可以將我想要做的事情歸檔嗎?我希望compress-commons
會幫助我,但顯然他們不會。
我想念什麼?
如果你想壓縮的內存對象是可序列化的,那麼這很容易。
您可以採取任何可序列化的實例並將其變爲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文件)。
感謝您的回答!使用這種方法可以在不同的文件夾中包含多個文件嗎?我確實希望有一個內存中的解決方案,因爲有些文件應該被加密,文件系統上不應該有未加密的文件版本。 – Hannes
如果你的意思是在zip中有一個目錄結構,那麼是的,我相信這可以通過使用[ZipOutputStream](https://docs.oracle.com/javase/8/docs/api/index.html?java /util/zip/ZipOutputStream.html)和適當的ZipEntry對象。 –
問題要求我們推薦或找到一本書,工具,軟件庫,教程或其他非現場資源,因爲它們傾向於吸引自以爲是的答案和垃圾郵件,因此無法用於Stack Overflow。相反,請描述問題以及到目前爲止解決問題所做的工作。 – JFPicard
你可以創建一個臨時文件夾,將文件保存到它,壓縮並在操作後刪除它 – Lino