2016-05-16 4 views
-2

Javaでディスクに書き込まずにファイルを解凍して再圧縮するプログラムを作成しようとしています。これまでのところ、ディスクに書き込むことなく解凍して再圧縮する - Java

public void unzipFile(String filePath) { 

    FileInputStream fis = null; 
    ZipInputStream zipIs = null; 
    ZipEntry zEntry = null; 
    try { 
     fis = new FileInputStream(filePath); 
     zipIs = new ZipInputStream(new BufferedInputStream(fis)); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     ZipOutputStream zos = new ZipOutputStream(baos); 
     while ((zEntry = zipIs.getNextEntry()) != null) { 
       zos.putNewEntry(zEntry); 
       zos.write(...); 
       zos.close(); 
} 
     } catch (IOException e){ 
      e.printStackTrace(); 
     } 
    } 
} 

私の問題は、ZipOutputStreamにZipEntryを書き込む方法がわかりません。 "java.util.zip.ZipException:無効なエントリサイズ(予想125673、しかし0バイトを持っています)"というエラーが表示されます。誰かが私を正しい方向に向けることができますか?

+3

まあ、まず第近い() ''ループ内で呼び出すことはありません。ここ

が実行されている例です。 – Andreas

+0

このメソッドをどのように呼びますか? –

+0

'"まず、ループ内でclose()を呼び出さないでください。 " - 真剣に –

答えて

-2

zos.write(...)ステートメントを持つZipInputStreamからZipOutputStreamにデータをコピーするだけで済みます。以下では、コピーをcopyStream()というヘルパーメソッドに分離しましたが、必要に応じてインライン展開することができます。

また、ループ内のストリームを閉じないでください。また、リソースの試行を使用してコードを変更してリソース管理を改善しましたので、もうclose()コールは表示されません。私のマシンで

public static void main(String[] args) throws Exception { 
    String filePath = System.getProperty("java.home") + "/lib/rt.jar"; 
    rezipFile(filePath); 
} 
public static void rezipFile(String filePath) throws IOException { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    try (
     ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(filePath))); 
     ZipOutputStream zos = new ZipOutputStream(baos); 
    ) { 
     for (ZipEntry zEntry; (zEntry = zis.getNextEntry()) != null;) { 
      zos.putNextEntry(zEntry); 
      copyStream(zis, zos); 
     } 
    } 
    System.out.println(baos.size() + " bytes copied"); 
} 
private static void copyStream(InputStream in, OutputStream out) throws IOException { 
    byte[] buf = new byte[4096]; 
    for (int len; (len = in.read(buf)) > 0;) 
     out.write(buf, 0, len); 
} 

出力は:

63275847 bytes copied 
関連する問題