※J2SE 1.4.2 で動作確認
■JavaでZIP圧縮

JavaでZIP圧縮ができないか?

圧縮なんてぜんぜん知りません。
圧縮・解凍ツールでファイルを圧縮したり、解凍する事はありますが、
Javaで作る・・・なんてできるのだろうか?
圧縮アルゴリズムから組むのか?とビクビクしました。

よくよく聞いてみると、提供されている 「java.util.zip」で実現できるとの事。

ならばと、サンプルコードを検索してみました。

【たけおばの門 - 圧縮ファイルを扱う】
http://takeoba.cool.ne.jp/moreJava/compression.htm

サンプルコードを組み込み、ファイルを圧縮できました。
圧縮まではできたのですが・・・

解凍ができない!

正確には「解凍できるツール」と、「解凍できないツール」が出てきました。

解凍できたツール: 解凍レンジ
解凍できなかったツール: Lhaplus


なんで?どうして??

どうも圧縮前に3つ、値を設定しなければいけないようだ。
設定する値とは、
  ・圧縮前のファイルサイズ
  ・圧縮後のファイルサイズ
  ・CRC-32の値

である。
圧縮前のサイズと、CRC-32は計算から取得できるが、
圧縮後のサイズ?
圧縮前に圧縮後のサイズを設定するの?
調べてみるが、圧縮後のサイズを取得するメソッドが見当たらない。
どないせーちゅうねん。

再度、ネットを検索。
サンプルソースを発見

【ZipOutputStream と ZipInputStream の扱い方サンプル。】
http://homepage3.nifty.com/akaho/program/java/zip/

圧縮後には、ファイルサイズを取得できるので、

「圧縮後のサイズ」の値を取得する為、圧縮し、
「圧縮後のサイズ」を設定して再度、圧縮する。

という手法をしている。
たしかに取得できるが、2度圧縮ロジックが走るのが
スッキリしない。
また、2度目は失敗した。との記述も気になる。

再度、何かないかネットを検索。

【ZipTool.java(海外)】
http://threebit.net/projects/sosc/current/sosc/doc/doxygen/html/ZipTool_8java-source.html

これかな・・・
「OutputStream」をオーバーライドして圧縮後のサイズを取得してるのか。
上記のソースを参考に、ロジックを作成。
ファイル圧縮後、無事、解凍できました。

ただし、上記のソースは、ライセンス「GPL」を使ってるので、参考程度で。

■参考リンク

【たけおばの門】
http://takeoba.cool.ne.jp/index.shtml

【Vector - 解凍レンジ】
http://www.vector.co.jp/vpack/browse/pickup/pw5/pw005284.html

【Vector - Lhaplus】
http://www.vector.co.jp/magazine/softnews/001209/n0012091.html

【IT用語辞典 e-Words - GPL】
http://e-words.jp/w/GPL.html