Java Tips | I/O・ネットワーク:gzip圧縮

Java Java
スポンサーリンク
スポンサーリンク

gzip解凍の内部構造と ZIP の違い

「gzipの中身がどう動いているか」と「ZIPと何が違うのか」という本質的な理解です。 ここでは、Java の話に限らず、圧縮形式そのものの仕組みを分かりやすく噛み砕いて説明します。 そして、必要なところには gzip や ZIP の追加解説に飛べるように Guided Link を入れています。

gzip解凍の内部構造

gzip は「圧縮形式」ではなく “圧縮されたデータを包むファイルフォーマット” です。 中身の圧縮アルゴリズムは DEFLATE という方式が使われています。

DEFLATE の内部構造

DEFLATE は次の二段構えで圧縮します。

1. LZ77(辞書圧縮)

繰り返し出てくるデータを「過去のどこにあったか」を参照する形で短く表現します。

例:

AAAAABBBBBBCCCC

というデータがあったら、

  • 「A が 5 回続く」
  • 「B が 6 回続く」
  • 「C が 4 回続く」

というように「繰り返し」を参照で表現します。

2. ハフマン符号化(可変長ビット圧縮)

よく出るデータは短いビット列、 あまり出ないデータは長いビット列で表現することで、全体をさらに圧縮します。

gzip解凍の流れ

gzipファイルを解凍するときは、次の順番で処理されます。

1. gzipヘッダを読む

gzipファイルの先頭には「これは gzip だよ」というメタ情報が入っています。

例:

  • 圧縮日時
  • OS種別
  • オプションフラグ
  • オリジナルファイル名(入っている場合)

2. DEFLATE のビット列を読み取る

gzip の本体部分は「DEFLATE の圧縮データ」です。 ここを読みながら、ハフマン符号を解読し、LZ77 の参照を展開していきます。

3. 展開されたバイト列を出力する

最終的に「元の生データ(byte[])」が復元されます。

Java の GZIPInputStream は、この一連の処理を内部で自動的に行っています。

ZIP の内部構造

ZIP は gzip と違い、「複数ファイルをまとめるアーカイブ形式」です。 圧縮方式としては同じ DEFLATE を使うことが多いですが、構造がまったく違います。

ZIP の特徴

1. 複数ファイルを格納できる

ZIP は「フォルダのような構造」を持ちます。

report.csv
image.png
config.json

などをひとまとめにできます。

2. 各ファイルごとに圧縮方式を選べる

ZIP 内の各ファイルは、次のように個別に圧縮方式を持ちます。

  • DEFLATE(一般的)
  • STORE(圧縮しない)
  • BZIP2(拡張)
  • LZMA(拡張)

gzip は「1ファイルだけ」なので、この柔軟性はありません。

3. ZIP には「中央ディレクトリ」がある

ZIP の末尾には「中央ディレクトリ」というメタ情報があり、 ZIP 内のファイル一覧・サイズ・圧縮方式などがまとめて記録されています。

これにより ZIP は「高速にファイル一覧を取得できる」という利点があります。

gzip と ZIP の違い(本質的な比較)

項目gzipZIP
格納できるファイル数1つだけ複数ファイル
圧縮方式DEFLATEのみDEFLATEが多いが複数方式を選べる
メタ情報最小限(日時・OSなど)ファイル一覧・サイズ・圧縮方式など大量
用途単一ファイルの圧縮アーカイブ(まとめて保存)
Javaでの扱いGZIPInputStream / GZIPOutputStreamZipInputStream / ZipOutputStream

gzip と ZIP の使い分け(実務での判断)

gzip を使うべき場面

  • ログファイルを圧縮して保存したい
  • CSV を圧縮して転送したい
  • Web API のレスポンスを軽量化したい
  • 単一ファイルを高速に圧縮したい

ZIP を使うべき場面

  • 複数ファイルをまとめて保存したい
  • フォルダ構造ごとバックアップしたい
  • ユーザーに「まとめてダウンロード」させたい
  • ファイルごとに圧縮方式を変えたい

まとめ:gzipとZIPの違いを一言で言うと

gzipは「1つのファイルを圧縮する袋」 ZIPは「複数ファイルをまとめる箱」

中身の圧縮方式は似ていても、目的と構造がまったく違います。

タイトルとURLをコピーしました