2016-03-28 12 views
0

通常のファイルを.zipに圧縮し、新しいファイルを作成せずにgzipファイルとして圧縮したいとします。 doc.pdf.zip.gz.zipをjavaの.gzに圧縮する方法は?

私はdoc.pdf.zipと呼ばれる新しいファイルをレコード生成し、それとgzipを開くにはしたくない:

例えば者は、doc.pdf、私が取得する必要がありますが私はPDF文書を持っているとしましょうそれ。

私は、ブラウザからファイルを取得し、戻ってそれを返すようにサーバに働いている、これは私の関数である:

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

私はファイルdoc.pdf.zip.gzを得るが、それは破損したファイルdoc.pdfとzip形式ではないがありますなぜ??

+0

'close()'呼び出しを 'finally'ブロックに移動します。 –

+0

ありがとう、私はそれをしましたが、同じことを返し続けます。 –

+0

はあなたの問題とは関係なく、最良の方法です:P –

答えて

1

私は、zip用の一時ファイルを作成してgzipに追加し、作成したzipファイルを削除できると思います。以下のコードサンプルはあなたに役立ちます。

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

希望します。

+0

ありがとう、実際に私の関数の目的は、.zipファイルを持っている必要がありますので、.zipファイルの内側にあるので、私の文書を持っているので、zipファイルをgzipすることです。 –

+0

ああ。この目的のために一時ファイルを使用することができます。私はあなたがそのことを記憶に残すことができるかどうかはわかりません。 – Sachin

+0

@PaulErdemBursh zipの一時ファイルを使用して回答を更新しました。見てみな。それが役に立てば幸い。 – Sachin

関連する問題