2010-10-25 13 views
5

Czy można utworzyć archiwum Zip w Javie, jeśli nie chcę zapisywać wynikowego archiwum na dysku, ale wysłać je gdzie indziej?Utwórz Java-Zip-Archive z istniejącego OutputStream

Chodzi o to, że utworzenie pliku na dysku może być stratą, gdy użytkownik chce wysłać archiwum Zip do użytkownika za pośrednictwem protokołu HTTP (np. Z bazy danych-Blob lub dowolnego innego magazynu danych).

Chciałbym stworzyć

java.util.zip.ZipOutputStream 

lub

apache.commons.ZipArchiveOutputStream 

gdzie podajnik będzie ByteArrayOutputStream pochodzących z mojego repozytorium Subversion

Odpowiedz

6

Tak jest to absolutnie możliwe!

Stwórz swoją pozycję Zip stosując metodę putNextEntry na ZipOutputStream następnie umieścić bajtów do pliku w zip wywołując write na ZipOutputStream. Dla parametru dla tej metody, byte[], po prostu wyodrębnij je z ByteArrayOutputStream za pomocą metody toByteArray.

I ZipOutputStream może być wysłany w dowolnym miejscu, ponieważ jego konstruktor zajmuje tylko OutputStream, więc może być np. twoja odpowiedź HTTP.

+0

W porządku, zadziałało! Ale w jaki sposób mogę utworzyć katalogi, które w rzeczywistości zawierają same pliki? Teraz wszystkie pliki są w porządku, ale katalogi są rozpakowywane jako pliki o zerowej długości w węźle głównym, więc nie ma żadnej hierarchii :-( – trajectory

+1

Pliki ZIP zawierają tylko płaską listę plików. może zawierać informacje o ścieżce. Wystarczy dodać 'ZipEntry' o nazwie takiej jak' dir/file.txt': to jest 'plik.txt' w katalogu' katalog '. –

+0

Tak, przez dodanie bezwzględnego adresu URL wszystko działa oczekiwany, dziękuję bardzo! – trajectory

3

Coś takiego będzie działać:

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

wejściowe: D: /in.xml

wyjściowy: D: /final.zip (o 2 pliki 001zip.txt, 002zip .txt)

Kod:

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(); 
          } 
             } 
         } 
Powiązane problemy