標準版と同様、ストリームに対して出力する。ファイル名を指定し、内部ではランダムアクセスファイルを使って出力する。PathやFilesを使って書き込む。生成されたzipファイルのサイズは、ランダムアクセスで作ったファイルの方がちょっと小さくなる。(データ自体の圧縮サイズは変わらない)どうもzipでは、圧縮する個々のファイル毎に、最初にヘッダー(ファイル名やサイズやCRC等の情報)を出力し、その後に圧縮したデータ本体、最後にフッター的な情報を出力するようだ。ストリームの場合は前に戻れないのでヘッダーのサイズ項目にはダミーの値を出力し、フッターにサイズやCRC等のチェック情報を入れるようだ。ランダムアクセスファイルを使うとファイル内を自由に移動できるので、フッターは使わず、ヘッダーに戻って書き込むのではないかと思う。したがってフッターの分だけストリームで出力したものよりサイズが減る、と。len);}}}}}1つの圧縮対象ファイルにつき、1つのZipEntryを生成する。(パスは「/」スラッシュ区切りにしておく必要がある)それをZipOutputStreamに登録してwrite()すると、データが圧縮される。コンストラクターを変えてやると圧縮にかかる実行時間に影響するので、ちょっと時間を計ってみた。40419バイトバッファリングをしたストリーム方式が、標準JavaでもAnt版でもほぼ同等の速度(若干Ant版の方が速そう)で一番速い。ランダムアクセス方式。バッファリングをしない標準Java版が一番遅い。生成されたzipファイルのサイズはランダムアクセス方式が一番小さく、ストリーム方式のAnt版が一番大きい。31最初の一行は、初期処理が入るためか、実行時間がけっこう長め。それ以外でときどき大きくなるのは、GCが働いているのではないかと思う。zipファイルの作成(無圧縮)Javaのzipファイルの作成では、通常の圧縮(Deflate)と無圧縮で格納するだけ(Store)の二種類の方法(Method)がある。[2007-12-19]あんまりStoreは使わないと思う(Storeの例もほとんど見たことない)ので、ここにメモしておく。zos.write(data);//終了zos.close();STOREDの場合、putNextEntry()を呼び出す前にデータサイズとCRCをセットしておく必要がある。(CRCはデータのチェックを行う為の値。いわゆるチェックサム)これらの値は、データ本体の前のヘッダー部に出力される。DEFLATEDの場合はCRCやデータサイズは自動的に計算されてデータ本体の直後(フッター部)に付加される。データサイズもCRCも出力データを元に算出するのでwrite()が終わってからでないと値が分からない。ストリーム(OutputStream)は前に戻れないから、ヘッダー部には書かずにフッター部に書く。STOREDの場合はそういったフッター部は使われないので、事前にセットしておく必要があるわけ。ちなみにCRC32#update()は、一度にデータ全部を渡すのではなく、1バイトずつ渡したりバイト配列を分割して渡したりしてもよい。reset()を呼び出すとコンストラクターで生成した直後の状態に戻るので、使い回すことが出来る。zipファイルの読み込み(解凍)zipファイルを読み込むクラスには、ZipInputStreamとZipFileといった複数の種類がある。Ant版ではZipFileだけある。メソッド名はちょっと違う(Antの方が整合性がとれているかな)。スピード的にはAnt版がちょっと遅いようだけど、どれも大差ない。入力ストリームから読み込む。ファイル名のエンコードはUTF-8。ファイル名のエンコードを指定する。