ZIPがストリーミング出来るのを知らなかったばかりに、痛い目にあった...
誰でもそんな体験をすると思うので、ZIPのストリーミングの概要について書きます。
ストリーミングとは
様々な意味がありますが、ここでは
- ZIPファイルが完成する前に出来た部分から逐次ファイルを送信する
ことを指します。
ZIPとは
ZIPはファイルフォーマットの一つで、複数のファイルを1つのファイルとしてまとめるためのフォーマットです。
意外にも、ZIPは圧縮方式を指すものではなく無圧縮のZIPも作ることが出来ます。
ZIPにファイルを追加する際は、先頭にファイル本体のデータを追加していき、圧縮もファイル単位で行います。
ファイル単位で先頭から順に追加されていくため、複数ファイルをZIPに登録する際でも順次ZIPファイルを書き出すことが出来ます。
ファイルのメタデータなどは、ZIPの末尾に付与されます。このメタデータを参照することにより、
- ファイルを実際に解凍しなくてもファイルの情報を見る
- ZIPの一部のみを解凍する
のような処理が可能となります。
多くのZIPは"deflate"と呼ばれる圧縮アルゴリズムを採用しています。
Deflateについて
DeflateはLZ77とハフマン符号を使用していて、RFCで規格が規定されています。
詳細は省略しますが、
-
LZ77はデータの繰り返し部分を検知して圧縮する手法
-
ハフマン符号は、よく出るバイトのパターンを検知してより短い記号で置き換える手法
になっています。解説記事がたくさんあるので見てね!
重要なのは、Deflateはストリーミングが可能な圧縮方式ということです。
圧縮対象のファイルをすべて読まなくても、圧縮ブロック単位で書き出すことが出来ます。
固定ハフマン符号ならブロック単位ですらなくバイト単位で逐次圧縮可能です。
結論 - ZIPとストリーミングについて
-
ZIPはファイルデータが先頭から順に並んでいるので、一部ファイルのみ追加されている状態でもファイル単位でストリーミングできる
-
ZIPで使われているDeflateは、暗号化方式にもよるがファイル全体を圧縮し終わる前でもストリーミング可能
-
以上2つにより、ZIPはアーカイブのファイルを圧縮しながらストリーミングをすることが出来る
圧縮しながら送信できるなんて、便利ですね!