2016-03-28 3 views
0

Ich möchte eine normale Datei in eine ZIP-Datei komprimieren und dann als GZIP-Datei komprimieren, ohne eine neue Datei zu erstellen.Wie komprimiert man eine .zip in .gz in Java?

Zum Beispiel lassen Sie uns sagen, dass ich ein PDF-Dokument doc.pdf haben, was ich zu bekommen habe, ist: doc.pdf.zip.gz

Ich will nicht eine neue Datei doc.pdf.zip genannt creat und dann öffnen und gzip es.

Ich bin mit einem Server arbeiten, um die Datei aus dem Browser zu bekommen und wieder zurückkehren, das ist meine Funktion:

public void ZIPandGZIP(String fileName, OutputStream os, String header) throws FileNotFoundException 
{ 
    File file = new File(fileName); 
    FileInputStream fis = new FileInputStream(file); 
    byte[] data = new byte[(int) file.length()]; 
    DataOutputStream dos = new DataOutputStream(os); 
    try { 
     dos.writeBytes(header); 
     ZipOutputStream zpos = new ZipOutputStream(os); 
     zpos.putNextEntry(new ZipEntry(fileName)); 
     GZIPOutputStream gos = (new GZIPOutputStream(zpos)); 
     fis.read(data); 
     gos.write(data); 

     zpos.flush(); 
     zpos.close(); 
     gos.flush(); 
     gos.close(); 
     dos.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

ich eine Datei doc.pdf.zip.gz bekommen, aber es hat eine beschädigte Datei doc.pdf und nicht gezippt Warum??

+0

Verschieben Sie die 'close()' Aufrufe zu einem 'finally' Block –

+0

Danke, ich habe das gemacht, aber es wird immer das Gleiche zurückgeben. –

+0

hatte nichts mit Ihrem Problem zu tun, nur beste Praxis: P –

Antwort

1

Ich denke, Sie können eine temporäre Datei für die Zip erstellen, fügen Sie es zu Gzip und löschen Sie dann die Zip, die erstellt wurde. Das folgende Codebeispiel sollte Ihnen dabei helfen.

public void ZIPandGZIP(String fileName, OutputStream os, String header) throws FileNotFoundException { 
    byte[] buffer = new byte[1024]; 
    FileInputStream fis = null; 
    FileOutputStream fos = null; 
    ZipOutputStream zos = null; 
    File tempZipFile = File.createTempFile(fileName, ".zip") 
    try { 
     fos = new FileOutputStream(tempZipFile); 
     zos = new ZipOutputStream(fos); 
     ZipEntry ze = new ZipEntry(fileName); 
     zos.putNextEntry(ze); 
     fis = new FileInputStream(fileName); 

     int len; 
     while ((len = fis.read(buffer)) > 0) { 
      zos.write(buffer, 0, len); 
     } 
     zos.closeEntry(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } finally { 
     if (fis != null) { 
      fis.close(); 
     } 
     if (zos != null) { 
      zos.close(); 
     } 
     if (fos != null) { 
      fos.close(); 
     } 
    } 

    addGzipFileToStream(tempZipFile, os, header); 
} 

private void addGzipFileToStream(File zipFile, OutputStream os, String header) throws FileNotFoundException { 

    byte[] buffer = new byte[1024]; 
    DataOutputStream dos = null; 
    GZIPOutputStream gzos = null; 
    FileInputStream inputStream = null; 
    try { 
     dos = new DataOutputStream(os); 
     dos.writeBytes(header); 

     gzos = new GZIPOutputStream(os); 
     inputStream = new FileInputStream(zipFile); 

     int len; 
     while ((len = inputStream.read(buffer)) > 0) { 
      gzos.write(buffer, 0, len); 
     } 
     gzos.finish(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } finally { 
     if (inputStream != null) { 
      inputStream.close(); 
     } 
     if (gzos != null) { 
      gzos.close(); 
     } 
     if (dos != null) { 
      dos.close(); 
     } 
     zipFile.delete(); 
    } 
} 

Ich hoffe, es hilft.

+0

Danke, eigentlich ist der Zweck meiner Funktion, eine gezippte Datei zu gzip, also innerhalb der .gz-Datei sollte ich eine .zip-Datei haben, die mein Dokument hat. –

+0

oh okay. Sie könnten eine temporäre Datei für diesen Zweck verwenden. Ich bin mir nicht sicher, ob Sie das in Erinnerung behalten können. – Sachin

+0

@PaulErdemBursh Ich habe meine Antwort basierend auf einer temporären Datei für die ZIP aktualisiert. Hör zu. Ich hoffe es hilft. – Sachin