2010-11-29 14 views
7

Kennt jemand eine Möglichkeit, einen Stream, den Sie schreiben, zu komprimieren? Ich versuche zu vermeiden, die Datei auf die Festplatte zu schreiben, und fragte mich, ob ich Daten einfach komprimieren kann, während Sie sie in den Stream schreiben.Wie kann ich eine Datei komprimieren, während ich darauf schreibe?

Der Anwendungsfall dahinter ist, dass die Raw-Datei sehr groß sein wird und wir vermeiden wollen, das gesamte Ding auf die Festplatte entzippt zu schreiben.

Antwort

8

Ich glaube, Sie würden sich für ZipOutputStream interessieren. Sie können in diesen Stream schreiben und ihn dann in eine gezippte Datei schreiben.

Überprüfen Sie auch dieses Tutorial für working with compressed (zipped) files in Java. Hier ist ein Ausschnitt aus diesem Tutorial, das eine hilfreiche Illustration sein könnte:

 BufferedInputStream origin = null; 
    FileOutputStream dest = new 
     FileOutputStream("c:\\zip\\myfigs.zip"); 
    ZipOutputStream out = new ZipOutputStream(new 
     BufferedOutputStream(dest)); 
    //out.setMethod(ZipOutputStream.DEFLATED); 
    byte data[] = new byte[BUFFER]; 
    // get a list of files from current directory 
    File f = new File("."); 
    String files[] = f.list(); 

    for (int i=0; i<files.length; i++) { 
     System.out.println("Adding: "+files[i]); 
     FileInputStream fi = new 
      FileInputStream(files[i]); 
     origin = new 
      BufferedInputStream(fi, BUFFER); 
     ZipEntry entry = new ZipEntry(files[i]); 
     out.putNextEntry(entry); 
     int count; 
     while((count = origin.read(data, 0, 
      BUFFER)) != -1) { 
      out.write(data, 0, count); 
     } 
     origin.close(); 
    } 
    out.close(); 
+0

Ich habe dieses Beispiel zu sehen, und nicht glaube, es war das, was ich suchte. Nachdem ich ein bisschen damit herumgespielt habe, verstehe ich endlich, was es macht. Der einzige Unterschied für mich ist, dass ich nicht wirklich durch irgendwelche Dateien iterieren werde. Ich werde nur einen neuen Eintrag in der Zip-Datei erstellen und stattdessen schreiben, was ich gerade in eine Datei schreibe. – Andrei

+0

@ Andrei- Ja, es gibt keinen Grund, dass Ihre Zip-Datei mehr als eine Datei darin enthalten muss. Froh, dass das geholfen hat! – pkaeding

1

Ich habe dies zuvor in einer Webapp gemacht. Ich habe einen Verweis auf den Servlet OutputStream und lieferte diesen dann an die ZipOutputStream. Dann habe ich einfach gezippt. Die gezippte Datei wurde dem Client-Browser bereitgestellt. Einfach. Diese

Verwandte Themen