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
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
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>
Assicurarsi di chiamare il close() - metodo in una fine blocco, o meglio: utilizzare la gestione automatica delle risorse di Java 7. – Puce
@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 .. :) –
@BlackPanther potresti elaborare più/mostrare una versione dettagliata per se il file di origine esiste in una directory locale. –