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

class Zlib::GzipReader

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

Abstract

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

require 'zlib'
=begin
# hoge.gz がない場合は下記で作成できる。
Zlib::GzipWriter.open('hoge.gz') { |gz|
  gz.puts 'hoge'
}
=end

Zlib::GzipReader.open('hoge.gz') {|gz|
  print gz.read
}

f = File.open('hoge.gz')
gz = Zlib::GzipReader.new(f)
print gz.read
gz.close

特異メソッド

new(io) -> Zlib::GzipReader

io と関連付けられた GzipReader オブジェクトを作成します。 GzipReader オブジェクトは io からデータを逐次リードして 解析/展開を行います。io には少なくとも、IO#read と 同じ動作をする read メソッドが定義されている必要があります。

ヘッダーの解析に失敗した場合 Zlib::GzipFile::Error 例外が 発生します。

[PARAM] io:
IO オブジェクト、もしくは少なくともIO#readと同じ動作をするreadメソッドが定義されているオブジェクト
[EXCEPTION] Zlib::GzipFile::Error:
ヘッダーの解析に失敗した場合発生します。
File.open('hoge.txt', "w") { |fp|
  fp.puts 'hoge'
}

f = File.open('hoge.txt')
begin
  Zlib::GzipReader.new(f)
rescue Zlib::GzipFile::Error => err
  puts "error", err #=> error
                    #=> not in gzip format
end
open(filename) -> Zlib::GzipReader
open(filename) {|gz| ... } -> object

filename で指定されるファイルを gzip ファイルとして オープンします。GzipReader オブジェクトを返します。 その他詳細は Zlib::GzipReader.newZlib::GzipReader.wrap と 同じです。

[PARAM] filename:
gzip ファイル名を文字列で指定します。
require 'zlib'

=begin
# hoge.gz がない場合はこれで作成する。
Zlib::GzipWriter.open('hoge.gz') { |gz|
  gz.puts 'hoge'
}
=end

Zlib::GzipReader.open('hoge.gz'){|gz|
  print gz.read
}
wrap(io) -> Zlib::GzipReader
wrap(io) {|gz| ... } -> object

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

[PARAM] io:
IO オブジェクトを指定します。
require 'zlib'

=begin
# hoge.gz がない場合はこれで作成する。
Zlib::GzipWriter.open('hoge.gz') { |gz|
  gz.puts 'hoge'
}
=end

f = File.open('hoge.gz')
Zlib::GzipReader.wrap(f){|gz|
  print gz.read
}
p f.closed? #=> true

f = File.open('hoge.gz')
Zlib::GzipReader.wrap(f){|gz|
  print gz.read
  gz.finish
}
p f.closed? #=> false

インスタンスメソッド

each([rs]) -> self
each_line([rs]) -> self

IO クラスの同名メソッドIO#each, IO#each_lineと同じです。

但し、gzip ファイル中に エラーがあった場合 Zlib::Error 例外や Zlib::GzipFile::Error 例外が発生します。

[PARAM] rs:
行の区切りを文字列で指定します。

gzip ファイルのフッターの処理に注意して下さい。 gzip ファイルのフッターには圧縮前データのチェックサムが 記録されています。GzipReader オブジェクトは、次の時に展開した データとフッターの照合を行い、エラーがあった場合は Zlib::GzipFile::NoFooter, Zlib::GzipFile::CRCError, Zlib::GzipFile::LengthError 例外を発生させます。

=begin
# hoge.gz がない場合は下記で作成できる。
Zlib::GzipWriter.open('hoge.gz') { |gz|
  gz.puts 'hoge'
  gz.puts 'fuga'
}
=end

Zlib::GzipReader.open('hoge.gz') { |gz|
  gz.each { |line|
    puts line
  }
}
[EXCEPTION] Zlib::Error:
Zlib::Error を参照
[EXCEPTION] Zlib::GzipFile::Error:
Zlib::GzipFile::Errorを参照
[EXCEPTION] Zlib::GzipFile::NoFooter:
Zlib::GzipFile::NoFooterを参照
[EXCEPTION] Zlib::GzipFile::CRCError:
Zlib::GzipFile::CRCErrorを参照
[EXCEPTION] Zlib::GzipFile::LengthError:
Zlib::GzipFile::LengthErrorを参照

[SEE_ALSO] IO#each

[SEE_ALSO] IO#each_line

each_byte -> nil

IO クラスの同名メソッドIO#each_byteと同じです。

但し、gzip ファイル中に エラーがあった場合 Zlib::Error 例外や Zlib::GzipFile::Error 例外が発生します。

gzip ファイルのフッターの処理に注意して下さい。 gzip ファイルのフッターには圧縮前データのチェックサムが 記録されています。GzipReader オブジェクトは、次の時に展開した データとフッターの照合を行い、エラーがあった場合は Zlib::GzipFile::NoFooter, Zlib::GzipFile::CRCError, Zlib::GzipFile::LengthError 例外を発生させます。

=begin
# hoge.gz がない場合は下記で作成できる。
Zlib::GzipWriter.open('hoge.gz') { |gz|
  gz.puts 'hoge'
}
=end

Zlib::GzipReader.open('hoge.gz') { |gz|
  gz.each_byte { |b|
    printf "%d -> %c\n", b, b
  }
}
#=> 104 -> h
#=> 111 -> o
#=> 103 -> g
#=> 101 -> e
#=> 10 ->
[EXCEPTION] Zlib::Error:
Zlib::Error を参照
[EXCEPTION] Zlib::GzipFile::Error:
Zlib::GzipFile::Errorを参照
[EXCEPTION] Zlib::GzipFile::NoFooter:
Zlib::GzipFile::NoFooterを参照
[EXCEPTION] Zlib::GzipFile::CRCError:
Zlib::GzipFile::CRCErrorを参照
[EXCEPTION] Zlib::GzipFile::LengthError:
Zlib::GzipFile::LengthErrorを参照

[SEE_ALSO] IO#each_byte

eof -> bool
eof? -> bool

圧縮データの終端に達した場合真を返します。 フッターが読み込まれていなくても真を返すことに注意して下さい。

=begin
# hoge.gz がない場合はこれで作成する。
Zlib::GzipWriter.open('hoge.gz') { |gz|
  gz.puts 'hoge'
  gz.puts 'fuga'
  gz.puts 'foga'
}
=end

Zlib::GzipReader.open('hoge.gz'){|gz|
  gz.each_line{|line|
    puts line
  }
  p gz.eof? #=> true
}
getc -> Fixnum | nil

IO クラスの同名メソッドIO#getcと同じです。

但し、gzip ファイル中に エラーがあった場合 Zlib::Error 例外や Zlib::GzipFile::Error 例外が発生します。

gzip ファイルのフッターの処理に注意して下さい。 gzip ファイルのフッターには圧縮前データのチェックサムが 記録されています。GzipReader オブジェクトは、次の時に展開した データとフッターの照合を行い、エラーがあった場合は Zlib::GzipFile::NoFooter, Zlib::GzipFile::CRCError, Zlib::GzipFile::LengthError 例外を発生させます。

=begin
# hoge.gz がない場合は下記で作成できる。
Zlib::GzipWriter.open('hoge.gz') { |gz|
  gz.puts 'hoge'
}
=end

Zlib::GzipReader.open('hoge.gz') { |gz|
  while c = gz.getc
    puts c
  end
}
#=> 104
#=> 111
#=> 103
#=> 101
#=> 10
[EXCEPTION] Zlib::Error:
Zlib::Error を参照
[EXCEPTION] Zlib::GzipFile::Error:
Zlib::GzipFile::Errorを参照
[EXCEPTION] Zlib::GzipFile::NoFooter:
Zlib::GzipFile::NoFooterを参照
[EXCEPTION] Zlib::GzipFile::CRCError:
Zlib::GzipFile::CRCErrorを参照
[EXCEPTION] Zlib::GzipFile::LengthError:
Zlib::GzipFile::LengthErrorを参照

[SEE_ALSO] IO#getc

gets([rs]) -> String | nil

IO クラスの同名メソッドIO#getsと同じです。

但し、gzip ファイル中に エラーがあった場合 Zlib::Error 例外や Zlib::GzipFile::Error 例外が発生します。

[PARAM] rs:
行の区切りを文字列で指定します。

gzip ファイルのフッターの処理に注意して下さい。 gzip ファイルのフッターには圧縮前データのチェックサムが 記録されています。GzipReader オブジェクトは、次の時に展開した データとフッターの照合を行い、エラーがあった場合は Zlib::GzipFile::NoFooter, Zlib::GzipFile::CRCError, Zlib::GzipFile::LengthError 例外を発生させます。

=begin
# hoge.gz がない場合は下記で作成できる。
Zlib::GzipWriter.open('hoge.gz') { |gz|
  gz.puts 'hoge'
  gz.puts 'fuga'
}
=end

Zlib::GzipReader.open('hoge.gz') { |gz|
  while l = gz.gets
    puts l
  end
}
#=> hoge
#=> fuga
[EXCEPTION] Zlib::Error:
Zlib::Error を参照
[EXCEPTION] Zlib::GzipFile::Error:
Zlib::GzipFile::Errorを参照
[EXCEPTION] Zlib::GzipFile::NoFooter:
Zlib::GzipFile::NoFooterを参照
[EXCEPTION] Zlib::GzipFile::CRCError:
Zlib::GzipFile::CRCErrorを参照
[EXCEPTION] Zlib::GzipFile::LengthError:
Zlib::GzipFile::LengthErrorを参照
lineno -> Fixnum | Bignum

IO クラスの同名メソッドIO#linenoと同じです。

但し、gzip ファイル中に エラーがあった場合 Zlib::Error 例外や Zlib::GzipFile::Error 例外が発生します。

gzip ファイルのフッターの処理に注意して下さい。 gzip ファイルのフッターには圧縮前データのチェックサムが 記録されています。GzipReader オブジェクトは、次の時に展開した データとフッターの照合を行い、エラーがあった場合は Zlib::GzipFile::NoFooter, Zlib::GzipFile::CRCError, Zlib::GzipFile::LengthError 例外を発生させます。

=begin
# hoge.gz がない場合は下記で作成できる。
Zlib::GzipWriter.open('hoge.gz') { |gz|
  gz.puts 'h'
  gz.puts 'o'
  gz.puts 'g'
  gz.puts 'e'
}
=end

Zlib::GzipReader.open('hoge.gz') { |gz|
  while l = gz.gets
    l.chomp!
    printf "%s %d\n", l, gz.lineno
  end
}
#=> h 1
#=> o 2
#=> g 3
#=> e 4
[EXCEPTION] Zlib::Error:
Zlib::Error を参照
[EXCEPTION] Zlib::GzipFile::Error:
Zlib::GzipFile::Errorを参照
[EXCEPTION] Zlib::GzipFile::NoFooter:
Zlib::GzipFile::NoFooterを参照
[EXCEPTION] Zlib::GzipFile::CRCError:
Zlib::GzipFile::CRCErrorを参照
[EXCEPTION] Zlib::GzipFile::LengthError:
Zlib::GzipFile::LengthErrorを参照

[SEE_ALSO] IO#lineno

lineno=(num) -> Integer

IO クラスの同名メソッドIO#lineno=と同じです。

但し、gzip ファイル中に エラーがあった場合 Zlib::Error 例外や Zlib::GzipFile::Error 例外が発生します。

[PARAM] num:
新たな行番号を整数で指定します。

gzip ファイルのフッターの処理に注意して下さい。 gzip ファイルのフッターには圧縮前データのチェックサムが 記録されています。GzipReader オブジェクトは、次の時に展開した データとフッターの照合を行い、エラーがあった場合は Zlib::GzipFile::NoFooter, Zlib::GzipFile::CRCError, Zlib::GzipFile::LengthError 例外を発生させます。

=begin
# hoge.gz がない場合は下記で作成できる。
Zlib::GzipWriter.open('hoge.gz') { |gz|
  gz.puts 'h'
  gz.puts 'o'
  gz.puts 'g'
  gz.puts 'e'
}
=end

Zlib::GzipReader.open('hoge.gz') { |gz|
  while l = gz.gets
    l.chomp!
    gz.lineno = 1000 if l == "o"
    printf "%s %d\n", l, gz.lineno
  end
}
#=> h 1
#=> o 1001
#=> g 1002
#=> e 1003
[EXCEPTION] Zlib::Error:
Zlib::Error を参照
[EXCEPTION] Zlib::GzipFile::Error:
Zlib::GzipFile::Errorを参照
[EXCEPTION] Zlib::GzipFile::NoFooter:
Zlib::GzipFile::NoFooterを参照
[EXCEPTION] Zlib::GzipFile::CRCError:
Zlib::GzipFile::CRCErrorを参照
[EXCEPTION] Zlib::GzipFile::LengthError:
Zlib::GzipFile::LengthErrorを参照

[SEE_ALSO] IO#lineno=

pos -> Fixnum
tell -> Fixnum

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

Zlib::GzipWriter.open('hoge.gz') { |gz|
  gz.puts 'hoge'
}

Zlib::GzipReader.open('hoge.gz'){|gz|
  while c = gz.getc
    printf "%c, %d\n", c, gz.pos
  end
}
# 実行例
#=> h, 1
#=> o, 2
#=> g, 3
#=> e, 4
#=>
#=> , 5
read([length]) -> String | nil

IO クラスの同名メソッドIO#readと同じです。

但し、gzip ファイル中に エラーがあった場合 Zlib::Error 例外や Zlib::GzipFile::Error 例外が発生します。

[PARAM] length:
読み込む文字列の文字数を整数で指定します。

gzip ファイルのフッターの処理に注意して下さい。 gzip ファイルのフッターには圧縮前データのチェックサムが 記録されています。GzipReader オブジェクトは、次の時に展開した データとフッターの照合を行い、エラーがあった場合は Zlib::GzipFile::NoFooter, Zlib::GzipFile::CRCError, Zlib::GzipFile::LengthError 例外を発生させます。

=begin
# hoge.gz がない場合は下記で作成できる。
Zlib::GzipWriter.open('hoge.gz') { |gz|
  gz.puts 'hoge_fuga'
}
=end

Zlib::GzipReader.open('hoge.gz') { |gz|
  p gz.read(4)  #=> "hoge"
  p gz.read     #=> "_fuga\n"
  p gz.read(1)  #=> nil
}
[EXCEPTION] Zlib::Error:
Zlib::Error を参照
[EXCEPTION] Zlib::GzipFile::Error:
Zlib::GzipFile::Errorを参照
[EXCEPTION] Zlib::GzipFile::NoFooter:
Zlib::GzipFile::NoFooterを参照
[EXCEPTION] Zlib::GzipFile::CRCError:
Zlib::GzipFile::CRCErrorを参照
[EXCEPTION] Zlib::GzipFile::LengthError:
Zlib::GzipFile::LengthErrorを参照

[SEE_ALSO] IO#read

readchar -> Fixnum

IO クラスの同名メソッドIO#readcharと同じです。

但し、gzip ファイル中に エラーがあった場合 Zlib::Error 例外や Zlib::GzipFile::Error 例外が発生します。

gzip ファイルのフッターの処理に注意して下さい。 gzip ファイルのフッターには圧縮前データのチェックサムが 記録されています。GzipReader オブジェクトは、次の時に展開した データとフッターの照合を行い、エラーがあった場合は Zlib::GzipFile::NoFooter, Zlib::GzipFile::CRCError, Zlib::GzipFile::LengthError 例外を発生させます。

=begin
# hoge.gz がない場合は下記で作成できる。
Zlib::GzipWriter.open('hoge.gz') { |gz|
  gz.puts 'hoge'
}
=end

Zlib::GzipReader.open('hoge.gz') { |gz|
  begin
    puts gz.readchar
  rescue EOFError => err
    puts err
    break
  end while true
}
#=> 104
#=> 111
#=> 103
#=> 101
#=> 10
#=> end of file reached
[EXCEPTION] EOFError:
EOF に到達したとき発生します。
[EXCEPTION] Zlib::Error:
Zlib::Error を参照
[EXCEPTION] Zlib::GzipFile::Error:
Zlib::GzipFile::Errorを参照
[EXCEPTION] Zlib::GzipFile::NoFooter:
Zlib::GzipFile::NoFooterを参照
[EXCEPTION] Zlib::GzipFile::CRCError:
Zlib::GzipFile::CRCErrorを参照
[EXCEPTION] Zlib::GzipFile::LengthError:
Zlib::GzipFile::LengthErrorを参照
readline([rs]) -> String

IO クラスの同名メソッドIO#readlineと同じです。

但し、gzip ファイル中に エラーがあった場合 Zlib::Error 例外や Zlib::GzipFile::Error 例外が発生します。

[PARAM] rs:
行の区切りを文字列で指定します。

gzip ファイルのフッターの処理に注意して下さい。 gzip ファイルのフッターには圧縮前データのチェックサムが 記録されています。GzipReader オブジェクトは、次の時に展開した データとフッターの照合を行い、エラーがあった場合は Zlib::GzipFile::NoFooter, Zlib::GzipFile::CRCError, Zlib::GzipFile::LengthError 例外を発生させます。

=begin
# hoge.gz がない場合は下記で作成できる。
Zlib::GzipWriter.open('hoge.gz') { |gz|
  gz.puts 'hoge'
  gz.puts 'fuga'
}
=end

Zlib::GzipReader.open('hoge.gz') { |gz|
  begin
    puts gz.readline
  rescue EOFError => err
    puts err
    break
  end while true
}
#=> hoge
#=> fuga
#=> end of file reached
[EXCEPTION] EOFError:
EOF に到達したとき発生します。
[EXCEPTION] Zlib::Error:
Zlib::Error を参照
[EXCEPTION] Zlib::GzipFile::Error:
Zlib::GzipFile::Errorを参照
[EXCEPTION] Zlib::GzipFile::NoFooter:
Zlib::GzipFile::NoFooterを参照
[EXCEPTION] Zlib::GzipFile::CRCError:
Zlib::GzipFile::CRCErrorを参照
[EXCEPTION] Zlib::GzipFile::LengthError:
Zlib::GzipFile::LengthErrorを参照

[SEE_ALSO] IO#readline

readlines([rs]) -> Array

IO クラスの同名メソッドIO#readlinesと同じです。

但し、gzip ファイル中に エラーがあった場合 Zlib::Error 例外や Zlib::GzipFile::Error 例外が発生します。

[PARAM] rs:
行の区切りを文字列で指定します。

gzip ファイルのフッターの処理に注意して下さい。 gzip ファイルのフッターには圧縮前データのチェックサムが 記録されています。GzipReader オブジェクトは、次の時に展開した データとフッターの照合を行い、エラーがあった場合は Zlib::GzipFile::NoFooter, Zlib::GzipFile::CRCError, Zlib::GzipFile::LengthError 例外を発生させます。

=begin
# hoge.gz がない場合は下記で作成できる。
Zlib::GzipWriter.open('hoge.gz') { |gz|
  gz.puts 'hoge'
  gz.puts 'fuga'
}
=end

Zlib::GzipReader.open('hoge.gz') { |gz|
  p gz.readlines #=>  ["hoge\n", "fuga\n"]
}
[EXCEPTION] Zlib::Error:
Zlib::Error を参照
[EXCEPTION] Zlib::GzipFile::Error:
Zlib::GzipFile::Errorを参照
[EXCEPTION] Zlib::GzipFile::NoFooter:
Zlib::GzipFile::NoFooterを参照
[EXCEPTION] Zlib::GzipFile::CRCError:
Zlib::GzipFile::CRCErrorを参照
[EXCEPTION] Zlib::GzipFile::LengthError:
Zlib::GzipFile::LengthErrorを参照

[SEE_ALSO] IO#readlines

readpartial(maxlen[, outbuf]) -> String

IO クラスの同名メソッドIO#readpartialと同じです。

[PARAM] maxlen:
IO#readpartialを参照してください。
[PARAM] outbuf:
IO#readpartialを参照してください。
[EXCEPTION] ArgumentError:
maxlen に負の値が入力された場合発生します。

[SEE_ALSO] IO#readpartial

rewind -> 0

ファイルポインタを Zlib::GzipReader.new を呼び出した直後の 時点に戻します。関連付けられている IO オブジェクトに seek メソッドが定義されている必要があります。

=begin
# hoge.gz がない場合はこれで作成する。
Zlib::GzipWriter.open('hoge.gz') { |gz|
  gz.puts 'hoge'
  gz.puts 'fuga'
}
=end

gz = Zlib::GzipReader.open('hoge.gz')
puts gz.gets #=> hoge
puts gz.gets #=> fuga
gz.rewind  #=> 0
puts gz.gets #=> hoge
gz.close
ungetc(char) -> nil

IO クラスの同名メソッドIO#ungetcと同じです。

IO クラスの同名メソッドと同じですが、gzip ファイル中に エラーがあった場合 Zlib::Error 例外や Zlib::GzipFile::Error 例外が発生します。

[PARAM] char:
読み戻したい1文字かそのコードポイントを指定します。

gzip ファイルのフッターの処理に注意して下さい。 gzip ファイルのフッターには圧縮前データのチェックサムが 記録されています。GzipReader オブジェクトは、次の時に展開した データとフッターの照合を行い、エラーがあった場合は Zlib::GzipFile::NoFooter, Zlib::GzipFile::CRCError, Zlib::GzipFile::LengthError 例外を発生させます。

=begin
# hoge.gz がない場合はこれで作成する。
Zlib::GzipWriter.open('hoge.gz') { |gz|
  gz.print 'hogefuga'
}
=end

Zlib::GzipReader.open('hoge.gz') { |gz|
  begin
    c1 = gz.getc
    c2 = gz.getc
    break if c2.nil?
    printf "%c -> %c\n", c1, c2
    gz.ungetc(c2)
  end while true
}

#=> h -> o
#=> o -> g
#=> g -> e
#=> e -> f
#=> f -> u
#=> u -> g
#=> g -> a
[EXCEPTION] Zlib::Error:
Zlib::Error を参照
[EXCEPTION] Zlib::GzipFile::Error:
Zlib::GzipFile::Errorを参照
[EXCEPTION] Zlib::GzipFile::NoFooter:
Zlib::GzipFile::NoFooterを参照
[EXCEPTION] Zlib::GzipFile::CRCError:
Zlib::GzipFile::CRCErrorを参照
[EXCEPTION] Zlib::GzipFile::LengthError:
Zlib::GzipFile::LengthErrorを参照

[SEE_ALSO] IO#ungetc

unused -> String | nil

gzip フォーマットの解析のために読み込んだ余剰のデータを返します。 gzip ファイルが最後まで解析されていない場合は nil を返します。

Methods

Classes