2014-05-12 14 views
17

Sto provando a comprimere un file (ad esempio foo.csv) e caricarlo su un server. Ho una versione funzionante che crea una copia locale e quindi elimina la copia locale. Come faccio a comprimere un file in modo da poterlo inviare senza scrivere sul disco rigido e farlo semplicemente in memoria?Creare un file zip in memoria

risposta

45

Utilizzare ByteArrayOutputStream con ZipOutputStream per completare l'operazione.

è possibile utilizzare ZipEntry per specificare i file da includere nel file zip.

Ecco un esempio di utilizzo delle classi di cui sopra,

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(); 
    } 

ora baos contiene il file zip come stream

+0

Assicurarsi di chiamare il close() - metodo in una fine blocco, o meglio: utilizzare la gestione automatica delle risorse di Java 7. – Puce

+0

@Puce: intendevo mostrare solo uno snippet, ma dopo il tuo commento ho sentito che aggiungere un codice più strutturato sarebbe positivo. Grazie per il commento .. :) –

+0

@BlackPanther potresti elaborare più/mostrare una versione dettagliata per se il file di origine esiste in una directory locale. –

3

Come l'API NIO.2, che era introdurre nel Java SE 7, supporti i file system personalizzati si potrebbe provare a combinare un filesystem in-memory come https://github.com/marschall/memoryfilesystem e il file system Zip fornito da Oracle.

Nota: ho scritto alcune classi di utilità per lavorare con il file system Zip.

La libreria è Open Source e potrebbe essere utile per iniziare.

Ecco il tutorial: http://softsmithy.sourceforge.net/lib/0.4/docs/tutorial/nio-file/index.html

È possibile scaricare la libreria da qui: http://sourceforge.net/projects/softsmithy/files/softsmithy/v0.4/

O con Maven:

<dependency> 
    <groupId>org.softsmithy.lib</groupId> 
    <artifactId>softsmithy-lib-core</artifactId> 
    <version>0.4</version> 
</dependency> 
Problemi correlati