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