2010-11-29 15 views
7

¿Alguien sabe de una forma de comprimir una secuencia en la que está escribiendo? Intento evitar escribir el archivo en el disco, y me preguntaba si puedo comprimir datos mientras los escribes en la transmisión.Cómo comprimir un archivo mientras escribe en él?

El caso de uso detrás de esto es que el archivo sin procesar va a ser muy grande y queremos evitar tener que escribir todo descomprimido en el disco.

Respuesta

8

Creo que le interesaría ZipOutputStream. Puede escribir en esa secuencia y luego escribirla en un archivo comprimido.

Además, consulte este tutorial para working with compressed (zipped) files in Java. Aquí hay un fragmento de ese tutorial, que podría ser una ilustración útil:

 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

que he visto en este ejemplo, y no creo que era lo que estaba buscando. Después de jugar un poco con eso, finalmente entiendo lo que hace. La única diferencia para mí es que realmente no voy a iterar a través de ningún archivo. Crearé una nueva entrada en el archivo comprimido y escribiré en esta entrada lo que estoy escribiendo actualmente en un archivo. – Andrei

+0

@ Andrei-- Sí, no hay ninguna razón para que su archivo comprimido necesite contener más de un archivo dentro. Me alegro de esto ayudó! – pkaeding

1

He hecho esto antes en una aplicación web. Obtuve una referencia al servlet OutputStream y luego lo suministré al ZipOutputStream. Luego, compruebo. El archivo comprimido se sirvió en el navegador del cliente. Fácil.

Cuestiones relacionadas