2010-10-25 22 views
5

¿Es posible crear un Zip-Archive en Java si no quiero escribir el archivo resultante en el disco pero enviarlo a otro lugar?Crear Java-Zip-Archive desde OutputStream existente

La idea es que puede ser un desperdicio crear un archivo en el disco cuando desee enviar el Zip-Archive a un usuario a través de HTTP (por ejemplo, desde una base de datos o cualquier otro almacén de datos).

me gustaría crear un

java.util.zip.ZipOutputStream 

o una

apache.commons.ZipArchiveOutputStream 

donde el alimentador sería un ByteArrayOutputStream viene de mi depósito de la subversión

Respuesta

6

Si esto es absolutamente posible!

Crear su entrada Zip utilizando el método de la putNextEntryZipOutputStream a continuación, poner los bytes en el archivo en el zip llamando write en el ZipOutputStream. Para el parámetro para ese método, el byte[], simplemente extráigalos desde el ByteArrayOutputStream con su método toByteArray.

Y el ZipOutputStream se puede enviar a cualquier parte, ya que su constructor solo toma un OutputStream, por lo que podría ser p. Ej. su respuesta HTTP

+0

Muy bien, eso funcionó! Pero ¿cómo creo Directorios que realmente contengan los archivos ellos mismos? Ahora mismo obtengo todos los archivos, está bien, pero los directorios están desempaquetados como archivos con longitud de cero bytes en el nodo raíz, por lo que no hay jerarquía en absoluto :-( – trajectory

+1

Los archivos ZIP solo contienen una lista plana de archivos. , puede contener información de ruta. Simplemente agregue un 'ZipEntry' con un nombre como' dir/file.txt': que es 'file.txt' dentro de un directorio' dir'. –

+0

Sí, al agregar la URL absoluta todo funciona esperado. ¡Muchas gracias! – trajectory

3

Algo así funcionaría:

ZipOutputStream zs = new ZipOutputStream(outputStream) ; 
ZipEntry e = new ZipEntry(fileName); 
zs.putNextEntry(e); 
zs.write(...); 
zs.close(); 
0

de entrada: D: /in.xml

Salida: D: /final.zip (que tiene 2 archivos 001zip.txt, 002zip .txt)

Código:

package com.stackoverflow.filezip; 

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipOutputStream; 

public class fileZip { 

public static void main(String[] args) { 

    try { 
InputStream in = new FileInputStream("D:/in.xml"); 
OutputStream out= new FileOutputStream("D:/final.zip"); 
ZipOutputStream zs = new ZipOutputStream(out); 

      ZipEntry e1 = new ZipEntry("001zip.txt"); 
      ZipEntry e2 = new ZipEntry("002zip.txt"); 
      zs.putNextEntry(e1); 
      zs.write("test content in file1".getBytes()); 
      zs.putNextEntry(e2); 
      zs.write("test content in file2".getBytes()); 

      zs.close(); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
          } 
             } 
         } 
Cuestiones relacionadas