2014-05-12 59 views
17

我想壓縮文件(例如foo.csv)並將其上傳到服務器。我有一個工作版本,它創建一個本地副本,然後刪除本地副本。我如何壓縮一個文件,以便我可以在不寫入硬盤的情況下發送它,並純粹在內存中執行它?在內存中創建一個Zip文件

回答

45

使用ByteArrayOutputStreamZipOutputStream來完成任務。

您可以使用ZipEntry指定要包含在zip文件中的文件 。

下面是使用上述類型的一個例子,

String s = "hello world"; 

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
try(ZipOutputStream zos = new ZipOutputStream(baos)) { 

    /* File is not on the disk, test.txt indicates 
    only the file name to be put into the zip */ 
    ZipEntry entry = new ZipEntry("test.txt"); 

    zos.putNextEntry(entry); 
    zos.write(s.getBytes()); 
    zos.closeEntry(); 

    /* use more Entries to add more files 
    and use closeEntry() to close each file entry */ 

    } catch(IOException ioe) { 
    ioe.printStackTrace(); 
    } 

現在baos包含您zip文件作爲stream

+0

確保您調用close() - 在最後的方法塊或更好:使用Java 7的自動資源管理。 – Puce

+0

@Puce:我打算僅顯示一段代碼,但在您發表評論之後,我認爲添加更多結構化的代碼會很好。感謝您的評論.. :) –

+0

@BlackPanther可以詳細說明/顯示一個詳細的版本,如果原始文件存在於本地目錄中。 –

3

作爲NIO.2 API,這是在Java SE 7引入,支撐自定義文件系統,您可以嘗試將內存文件系統(如https://github.com/marschall/memoryfilesystem)與Oracle提供的Zip文件系統結合使用。

注意:我已經編寫了一些實用程序類來使用Zip文件系統。

該庫是開源的,它可能有助於開始。

這裏是教程:http://softsmithy.sourceforge.net/lib/0.4/docs/tutorial/nio-file/index.html

你可以從這裏下載庫:http://sourceforge.net/projects/softsmithy/files/softsmithy/v0.4/

或者使用Maven:

<dependency> 
    <groupId>org.softsmithy.lib</groupId> 
    <artifactId>softsmithy-lib-core</artifactId> 
    <version>0.4</version> 
</dependency> 
相關問題