daybreaksnow's diary

私を私と呼びたい

[Java]zipファイルの解凍ではまる(ファイル末尾にヌル文字が1バイトできる)

Javaからzipファイルを解凍したい。
java.util.zipパッケージのクラスを使うと、文字コードUTF-8固定で、Windows環境で圧縮された日本語ファイルの解凍時に文字化けが発生する。
そのため、apache-antに入っているorg.apache.tools.zipパッケージのクラスを使うとよい。
参考:Java Zipファイルメモ(Hishidama's java zip Memo)


以下のサイトでjava.util.zipを使ったサンプルがあり、これをorg.apache.tools.zipを使うように書き換えた。
Java Sample ZIP解凍サンプル


しかし、利用するクラスを変更した結果、解凍したファイルの末尾1バイトにヌル文字が入ってしまうようになった。(java.util.zipを利用する場合は問題なし)
これにより、解凍したxlsファイルをPOIで読み込む際、以下の例外が発生した。

java.io.IOException: Unable to read entire block; 1 byte read; expected 512 bytes

そこでapacheの方を使っているサンプルを探し、以下を用いるようにしたところ、正常に解凍できるようになった。
JavaでZipファイルを解凍(コピペ用) - よんちゅBlog

出力処理を行っているコードの差異は以下の通り。

http://www.ra13.org/java/ZipDecompresser.html

InputStream is = zipFile.getInputStream(ze);
bis = new BufferedInputStream(is);
bos = new BufferedOutputStream(new FileOutputStream(outFile));

int ava;
while ((ava = bis.available()) > 0) {
   byte[] bs = new byte[ava];
   // 入力
   bis.read(bs);
   // 出力
   bos.write(bs);
}

http://yonchu.hatenablog.com/entry/20100727/1280239709

 fos = new FileOutputStream( outFile);
 is = zipFile.getInputStream( ze);

 byte[] buf = new byte[1024];
 int size = 0;
 while ( (size = is.read( buf)) != -1) {
   fos.write( buf, 0, size);
 }
 fos.flush();