2014-05-12 5 views
17

Ich versuche, eine Datei zip (z. B. foo.csv) und laden Sie sie auf einen Server. Ich habe eine funktionierende Version, die eine lokale Kopie erstellt und dann die lokale Kopie löscht. Wie würde ich eine Datei komprimieren, so dass ich sie senden könnte, ohne auf die Festplatte zu schreiben und rein im Speicher zu tun?Erstellen Sie eine Zip-Datei im Speicher

Antwort

45

Verwenden Sie ByteArrayOutputStream mit ZipOutputStream, um die Aufgabe zu erfüllen.

können Sie ZipEntry verwenden, um die Dateien angeben eingeschlossen in der Zip-Datei werden. Hier

ist ein Beispiel für die oben genannten Klassen,

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

jetzt baos enthält Ihre Zip-Datei als stream

+0

Achten Sie darauf, die enge nennen() - Methode in einem schließlich Blockieren oder besser: Verwenden Sie die automatische Ressourcenverwaltung von Java 7. – Puce

+0

@Puce: Ich wollte nur ein Snippet zeigen, aber nach Ihrem Kommentar hatte ich das Gefühl, dass das Hinzufügen eines strukturierteren Codes gut wäre. Danke für den Kommentar .. :) –

+0

@BlackPanther könnten Sie mehr/zeigen eine detaillierte Version für, wenn die Origin-Datei in einem lokalen Verzeichnis existiert. –

3

Als NIO.2 API, die in Java SE 7, unterstützt einzuführen war Bei benutzerdefinierten Dateisystemen könnten Sie versuchen, ein In-Memory-Dateisystem wie https://github.com/marschall/memoryfilesystem und das von Oracle bereitgestellte Zip-Dateisystem zu kombinieren.

Hinweis: Ich habe einige Dienstprogrammklassen geschrieben, um mit dem Zip-Dateisystem zu arbeiten.

Die Bibliothek ist Open Source und könnte Ihnen den Einstieg erleichtern. Hier

ist das Tutorial: http://softsmithy.sourceforge.net/lib/0.4/docs/tutorial/nio-file/index.html

Sie die Bibliothek von hier herunterladen können: http://sourceforge.net/projects/softsmithy/files/softsmithy/v0.4/

Oder mit Maven:

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