Ruby-zlibファイル圧縮

Ruby zlibとは

Ruby zlibは、gzipなどで使われている可逆圧縮アルゴリズムのライブラリです。

gzipファイルの読み書きも可能となります。


Ruby zlibはgzipと同様にファイルに対する圧縮/解凍処理を行います。

ディレクトリに対して圧縮する場合には、tarコマンドなどでディレクトリをファイルにまとめ、その後圧縮処理を行う必要があります。


zlibメソッド

文字列の圧縮処理

入力された文字列に対する圧縮処理を行います。


Zlib::Deflate.deflate(string[, level])
  • 第1引数に圧縮対象の文字列データを指定します。
  • 第2引数で圧縮レベルを指定します。指定引数は以下の通りです。
Zlib::BEST_SPEED 処理速度を優先して、圧縮率は低くなります
Zlib::BEST_COMPRESSION 圧縮率を優先して、処理速度は遅くなります。
Zlib::DEFAULT_COMPRESSION は第2引数を省略したときと同じです。
Zlib::NO_COMPRESSION 圧縮しません。これは既に圧縮されているものなど、追加の圧縮処理が期待できないものをZlibに含める場合などに利用します。

使い方は以下の通りです。


require 'zlib'
string = "test message"
data = Zlib::Deflate.deflate(string,Zlib::BEST_SPEED)

文字列の展開(解凍)処理

gz圧縮された文字列に対する展開処理を行います。


Zlib::Inflate.inflate(string)
  • 第1引数に展開対象の文字列データを指定します。

使い方は以下の通りです。


require 'zlib'
before = "test message"
archive_data = Zlib::Deflate.deflate(string,Zlib::BEST_SPEED)
after =  Zlib::Inflate.inflate(archive_data)
print(after)

gz形式ファイルの読み込み

gzip形式の圧縮ファイルを読み込むラッパークラスを利用します。

IOクラスのインスタンスと関連付けて使用します。


Zlib::GzipReader

ストリームの読み取りのように使用することができます。


require 'zlib'
Zlib::GzipReader.open('sample.gz') do |gz|
  p gz.read
end

IOオブジェクトのgzipデータの読み込みは以下のようにwapメソッドを使用します。


require 'zlib'
File.open('sample.gz', 'rb') do |fd|
  Zlib::GzipReader.wrap(fd) do |gz|
    p gz.read
  end
end

gz形式ファイルの書き込み

gzip形式の圧縮ファイルを書き出すラッパークラスです。

IOクラスのインスタンスと関連付けて使用します。


Zlib::GzipWriter

gzipデータへの書き込みは以下の通りです。。


require 'zlib'
Zlib::GzipWriter.open('sample.gz') do |gz|
  gz.puts "message"
end

ブロック付きの方法以外に、File.openなどと同じようにブロックなしで呼び出して、後からcloseする使い方も可能です。

ただし、GzipWriterオブジェクトは必ず「Zlib::GzipWriter#close」などを用いてクローズ処理を実行する必要があります。

クローズ処理がなければフッターを書き出すことができず、壊れたgzipファイルを生成してしまう可能性があります。


fd = File.open('sample.gz', 'w')
gz = Zlib::GzipWriter.new(fd)
gz.write string
gz.close


関連ページ