Ruby 1.9.2 リファレンスマニュアル > ライブラリ一覧 > zlibライブラリ > Zlib::GzipWriterクラス

class Zlib::GzipWriter

クラスの継承リスト: Zlib::GzipWriter < Zlib::GzipFile < Object < Kernel < BasicObject

Abstract

gzip 形式の圧縮ファイルを書き出すラッパークラスです。 IO クラスのインスタンス (又は IO クラスのインスタンスと同じメソッドを 持つオブジェクト) と関連付けて使用します。

Zlib::GzipWriter.open('hoge.gz') {|gz|
  gz.write 'jugemu jugemu gokou no surikire...'
}

f = File.open('hoge.gz', 'w')
gz = Zlib::GzipWriter.new(f)
gz.write 'jugemu jugemu gokou no surikire...'
gz.close

なお、Ruby の finalizer の制約のため、GzipWriter オブジェクトは必ず Zlib::GzipWriter#close 等を用いてクローズしてください。 そうしなければフッターを書き出すことができず、壊れた gzip ファイルを 生成してしまう可能性があります。

特異メソッド

new(io, level = Zlib::DEFAULT_COMPRESSION, strategy = Zlib::DEFAULT_STRATEGY) -> Zlib::GzipWriter

io と関連付けられた GzipWriter オブジェクトを作成します。 level, strategy は Zlib::Deflate.new と同じです。 GzipWriter オブジェクトは io に gzip 形式のデータを 逐次ライトします。io には少なくとも、IO#write と 同じ動作をする write メソッドが定義されている必要があります。

[PARAM] io:
IOオブジェクト、もしくは少なくとも、 IO#write と 同じ動作をする write メソッドが定義されている必要があります。
[PARAM] level:
0-9の範囲の整数を指定します。詳細はzlib.hを参照してください。
[PARAM] strategy:
Zlib::FILTERED, Zlib::HUFFMAN_ONLY, Zlib::DEFAULT_STRATEGYなど指定します。詳細はzlib.h を>参照してください。
require 'zlib'

filename='hoge1.gz'
f = File.open(filename, "w")
gz = Zlib::GzipWriter.new(f)
gz.puts "hogehoge" * 100
gz.close
p gz.closed? #=> true
p FileTest.size(filename) #=> 32
open(filename, level = Zlib::DEFAULT_COMPRESSION, strategy = Zlib::DEFAULT_STRATEGY) -> Zlib::GzipWriter
open(filename, level = Zlib::DEFAULT_COMPRESSION, strategy = Zlib::DEFAULT_STRATEGY) {|gz| ... } -> object

filename で指定されるファイルを gzip 圧縮データの 書き出し用にオープンします。GzipWriter オブジェクトを返します。 その他詳細は Zlib::GzipWriter.newZlib::GzipWriter.wrap と 同じです。

[PARAM] filename:
ファイル名を文字列で指定します。
[PARAM] level:
0-9の範囲の整数、または Zlib::NO_COMPRESSION, Zlib::BEST_SPEED, Zlib::BEST_COMPRESSION, Zlib::DEFAULT_COMPRESSION を指定します。 詳細はzlib.hを参照してください。
[PARAM] strategy:
Zlib::FILTERED, Zlib::HUFFMAN_ONLY, Zlib::DEFAULT_STRATEGYなど指定します。 詳細はzlib.h を参照してください。
require 'zlib'

filename='hoge1.gz'
gz = Zlib::GzipWriter.open(filename)
gz.puts "hogehoge" * 100
gz.close
p gz.closed? #=> true
p FileTest.size(filename) #=> 32
wrap(io, level = Zlib::DEFAULT_COMPRESSION, strategy = Zlib::DEFAULT_STRATEGY) -> Zlib::GzipWriter
wrap(io, level = Zlib::DEFAULT_COMPRESSION, strategy = Zlib::DEFAULT_STRATEGY) {|gz| ... } -> object

io と関連付けられた GzipWriter オブジェクトを作成します。 ブッロクが与えられた場合、 それを引数としてブロックを実行します。 ブロックの実行が終了すると、GzipWriter オブジェクトは自動的に クローズされます。関連付けられている IO オブジェクトまで クローズしたくない時は、ブロック中で Zlib::GzipFile#finish メソッドを呼び出して下さい。

[PARAM] io:
IOオブジェクト、もしくは少なくとも、 IO#write と 同じ動作をする write メソッドが定義されている必要があります。
[PARAM] level:
0-9の範囲の整数を指定します。詳細はzlib.hを参照してください。
[PARAM] strategy:
Zlib::FILTERED, Zlib::HUFFMAN_ONLY, Zlib::DEFAULT_STRATEGYなど指定します。 詳細はzlib.h を参照してください。
require 'zlib'

def case1
  filename='hoge1.txt'
  f = File.open(filename, "w")
  Zlib::GzipWriter.wrap(f, Zlib::NO_COMPRESSION){|gz|
    gz.puts "hogehoge" * 100
  }
  p f.closed? #=> true
  p FileTest.size(filename) #=> 824
end

def case2
  filename='hoge1.gz'
  f = File.open(filename, "w")
  Zlib::GzipWriter.wrap(f, Zlib::BEST_COMPRESSION){|gz|
    gz.puts "hogehoge" * 100
    gz.finish
  }
  p f.closed? #=> false
  f.close
  p FileTest.size(filename) #=> 32
end

case1
case2

インスタンスメソッド

self << str
putc(ch)
puts(*strs)
print(*strs)
printf(format, *args)
write(str)

IO クラスの同名メソッドと同じです。詳しくは IO#<<, IO#putc, IO#puts, IO#print, IO#printf, IO#write を参照してください。

require 'zlib'

filename='hoge1.gz'
fw = File.open(filename, "w")
Zlib::GzipWriter.wrap(fw, Zlib::BEST_COMPRESSION){|gz|
  gz << "hoge"
  gz.puts "fuga"
  gz.putc ?u
  gz.putc ?g
  gz.putc ?o
  gz.print "ugo"
  gz.printf("\n%9s", "bar")
  gz.write "foo"
}
fr = File.open(filename)
Zlib::GzipReader.wrap(fr){|gz|
  puts gz.read
}
#=> hogefuga
#=> ugougo
#=>       barfoo

[SEE_ALSO] IO#<<, IO#putc, IO#puts, IO#print, IO#printf, IO#write

close -> File
finish -> File

フッターを書き出し、GzipWriter オブジェクトをクローズします。close と finish の違いは Zlib::GzipFile#close, Zlib::GzipFile#finish を 参照して下さい。

注意: Ruby の finalizer の制約のため、GzipWriter オブジェクトは 必ずクローズしてください。そうしなければフッターを書き出すことが できず、壊れた gzip ファイルを生成してしまう可能性があります。

require 'zlib'

def case_finish
  filename='hoge1.gz'
  gz = Zlib::GzipWriter.open(filename, 9)
  gz.puts "hogehoge\n" * 100
  f = gz.finish
  p f.atime
  # 例
  #=> Sun Jul 06 15:43:57 +0900 2008
end

def case_close
  filename='hoge1.gz'
  gz = Zlib::GzipWriter.open(filename, 9)
  gz.puts "hogehoge\n" * 100
  f = gz.close
  begin
    p f.atime
  rescue IOError => err
    puts err #=> closed stream
  end
end

case_finish
case_close
comment=(string) -> String

gzip ファイルのヘッダーに記録するコメントを指定します。 Zlib::GzipWriter#write 等の書き込み系メソッドを 呼んだ後で指定しようとすると Zlib::GzipFile::Error 例外が 発生します。

[PARAM] string:
gzip ファイルのヘッダーに記録するコメントを文字列で指定します。
[RETURN]
string を返します。
require 'zlib'

filename='hoge1.gz'
fw = File.open(filename, "w")
Zlib::GzipWriter.wrap(fw, Zlib::BEST_COMPRESSION){|gz|
  gz.comment = "hogehoge"
  p gz.comment #=> "hogehoge"
}
fr = File.open(filename)
Zlib::GzipReader.wrap(fr){|gz|
  puts gz.comment #=> hogehoge
}
flush(flush = Zlib::SYNC_FLUSH) -> self

まだ書き出されていないデータをフラッシュします。 flush は Zlib::Deflate#deflate と同じです。 省略時は Zlib::SYNC_FLUSH が使用されます。 flush に Zlib::NO_FLUSH を指定することは無意味です。

[PARAM] flush:
Zlib::NO_FLUSH Zlib::SYNC_FLUSH Zlib::FULL_FLUSH などを指定します。
require 'zlib'

def case1
  filename='hoge1.gz'
  fw = File.open(filename, "w")
  Zlib::GzipWriter.wrap(fw, Zlib::BEST_COMPRESSION){|gz|
    gz.puts "fuga"
    gz.puts "ugo"
  }
  p File.read(filename)
end

def case2
  filename='hoge1.gz'
  fw = File.open(filename, "w")
  Zlib::GzipWriter.wrap(fw, Zlib::BEST_COMPRESSION){|gz|
    gz.puts "fuga"
    gz.flush
    gz.puts "ugo\n"
    gz.flush
  }
  p File.read(filename)
end

case1
#=> "\037\213\b\000p\257pH\002\003K+MO\344*M\317\347\002\000<\326\000\371\t\000\000\000"
case2
#=> "\037\213\b\000p\257pH\002\003J+MO\344\002\000\000\000\377\377*M\317\347\002\000\000\000\377\377\003\000<\326\000\371\t\000\000\000"
mtime=(time) -> Fixnum

gzip ファイルのヘッダーに記録する最終更新時間を指定します。 Zlib::GzipWriter#write 等の書き込み系メソッドを 呼んだ後で指定しようとすると Zlib::GzipFile::Error 例外が 発生します。

[PARAM] time:
gzip ファイルのヘッダーに記録する最終更新時間を整数で指定します。
[RETURN]
time を返します。
require 'zlib'

filename='hoge1.gz'
fw = File.open(filename, "w")
Zlib::GzipWriter.wrap(fw, Zlib::BEST_COMPRESSION){|gz|
  p gz.mtime = 1 #=> 1
}
fr = File.open(filename)
Zlib::GzipReader.wrap(fr){|gz|
  puts gz.mtime
  # 例
  #=> Thu Jan 01 09:00:01 +0900 1970
}
orig_name=(filename) -> String

gzip ファイルのヘッダーに記録する元ファイル名を指定します。 Zlib::GzipWriter#write 等の書き込み系メソッドを 呼んだ後で指定しようとすると Zlib::GzipFile::Error 例外が 発生します。

[PARAM] filename:
gzip ファイルのヘッダーに記録する元ファイル名を文字列で指定します。
[RETURN]
filename を返します。
require 'zlib'

filename='hoge1.gz'
fw = File.open(filename, "w")
Zlib::GzipWriter.wrap(fw, Zlib::BEST_COMPRESSION){|gz|
  gz.orig_name = "hogehoge"
  p gz.orig_name #=> "hogehoge"
}
fr = File.open(filename)
Zlib::GzipReader.wrap(fr){|gz|
  puts gz.orig_name #=> hogehoge
}
pos -> Fixnum
tell -> Fixnum

現在までに圧縮したデータの長さの合計を返します。 ファイルポインタの位置ではないことに注意して下さい。

require 'zlib'

filename='hoge1.gz'
f = File.open(filename, "w")
Zlib::GzipWriter.wrap(f, Zlib::BEST_COMPRESSION){|gz|
  (1..10).each {|i|
    gz.print i
    puts gz.pos
  }
}
#=> 1
#=> 2
#=> 3
...

Methods

Classes