2010-10-25 8 views
5

Est-il possible de créer une archive Zip en Java si je ne veux pas écrire l'archive résultante sur le disque mais l'envoyer ailleurs? L'idée est que cela peut être une perte de créer un fichier sur le disque lorsque vous voulez envoyer le Zip-Archive à un utilisateur via HTTP (par exemple à partir d'un Database-Blob ou de tout autre Data-Store).Création de Java-Zip-Archive à partir de OutputStream existant

Je voudrais créer un

java.util.zip.ZipOutputStream 

ou

apache.commons.ZipArchiveOutputStream 

où le chargeur serait un ByteArrayOutputStream venant de mon dépôt Subversion

Répondre

6

Oui cela est tout à fait possible!

Créer votre entrée Zip à l'aide de la méthode putNextEntry sur la ZipOutputStream puis mettre les octets dans le fichier dans le zip en appelant write sur le ZipOutputStream. Pour le paramètre de cette méthode, le byte[], il suffit de les extraire du ByteArrayOutputStream avec sa méthode toByteArray.

Et le ZipOutputStream peut être envoyé n'importe où, car son constructeur prend juste un OutputStream donc pourrait être par ex. votre réponse HTTP.

+0

Très bien, ça a marché! Mais comment puis-je créer des répertoires qui contiennent effectivement les fichiers eux-mêmes alors? En ce moment je reçois tous les fichiers, bien, mais les répertoires sont décompressés comme des fichiers avec une longueur de zéro octet dans le nœud racine, donc pas de hiérarchie du tout :-( – trajectory

+1

Les fichiers ZIP contiennent juste une liste de fichiers. Vous pouvez ajouter un 'ZipEntry' avec un nom tel que' dir/file.txt': c'est 'fichier.txt' dans un répertoire' dir' –

+0

Oui, en ajoutant l'URL absolue tout fonctionne attendu Merci beaucoup! – trajectory

3

Quelque chose comme ça fonctionnerait:

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

Entrée: D: /in.xml

Sortie: D: /final.zip (2 fichiers ayant 001zip.txt, 002zip txt)

code:

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