Zlib::GzipReader
class Zlib::GzipReader
Parent:Zlib::GzipFileIncluded modules:Enumerable
Zlib :: GzipReader 是读取 gzip 文件的类。GzipReader 应该用作 IO 或类似 IO 的对象。
Zlib::GzipReader.open('hoge.gz') {|gz|
print gz.read
}
File.open('hoge.gz') do |f|
gz = Zlib::GzipReader.new(f)
print gz.read
gz.close
end
方法目录
Zlib :: GzipReader 中的以下方法与 IO 中的对应方法相似,但如果在 gzip 文件中发现错误,则会引发 Zlib :: Error 或 Zlib :: GzipFile :: Error 异常。
- each
- each_line
- each_byte
- gets
- getc
- lineno
- lineno=
- read
- readchar
- readline
- readlines
- ungetc
小心 gzip 文件的页脚。gzip 文件的脚注中包含预压缩数据的校验和。GzipReader 在下列情况下,针对该校验和检查所有未压缩的数据,如果失败,引发Zlib::GzipFile::NoFooter
,Zlib::GzipFile::CRCError
或Zlib::GzipFile::LengthError
例外。
- 当超出文件结尾(压缩数据结束)收到读取请求时。也就是说,当 #read,#gets 或其他读取方法返回 nil 时。
- 当对象到达文件结尾后调用 Zlib :: GzipFile#close 方法时。
- 当对象到达文件结尾时调用#unused 方法。
其余的方法在他们自己的文档中有充分的描述。
公共类方法
Zlib::GzipReader.new(io, options = {}) Show source
创建与之关联的 GzipReader 对象io
。GzipReader 对象读取 gzip 压缩的数据io
,并解析/解压缩它。在io
必须有一个read
作为IO#阅读行为同样的方法。
options
散列可以被用于设置数据的编码。:external_encoding
,:internal_encoding
并且:encoding
可以被设置为在 IO.new。
如果 gzip 文件头不正确,则会引发 Zlib :: GzipFile :: Error 异常。
static VALUE
rb_gzreader_initialize(int argc, VALUE *argv, VALUE obj)
{
VALUE io, opt = Qnil;
struct gzfile *gz;
int err;
TypedData_Get_Struct(obj, struct gzfile, &gzfile_data_type, gz
rb_scan_args(argc, argv, "1:", &io, &opt
/* this is undocumented feature of zlib */
err = inflateInit2(&gz->z.stream, -MAX_WBITS
if (err != Z_OK) {
raise_zlib_error(err, gz->z.stream.msg
}
gz->io = io;
ZSTREAM_READY(&gz->z
gzfile_read_header(gz
rb_gzfile_ecopts(gz, opt
if (rb_respond_to(io, id_path)) {
gz->path = rb_funcall(gz->io, id_path, 0
rb_define_singleton_method(obj, "path", rb_gzfile_path, 0
}
return obj;
}
Zlib::GzipReader.open(filename) {|gz| ... } Show source
打开由filename
gzip 文件指定的文件,并返回与该文件关联的 GzipReader 对象。这个方法的更多细节在:: new 和 ZLib :: GzipFile.wrap 中。
static VALUE
rb_gzreader_s_open(int argc, VALUE *argv, VALUE klass)
{
return gzfile_s_open(argc, argv, klass, "rb"
}
公共实例方法
bytes() Show source
这是一个不推荐的别名each_byte
。
static VALUE
rb_gzreader_bytes(VALUE obj)
{
rb_warn("Zlib::GzipReader#bytes is deprecated; use #each_byte instead"
if (!rb_block_given_p())
return rb_enumeratorize(obj, ID2SYM(rb_intern("each_byte")), 0, 0
return rb_gzreader_each_byte(obj
}
each(*args) Show source
有关说明,请参阅 Zlib :: GzipReader 文档。
static VALUE
rb_gzreader_each(int argc, VALUE *argv, VALUE obj)
{
VALUE str;
RETURN_ENUMERATOR(obj, 0, 0
while (!NIL_P(str = gzreader_gets(argc, argv, obj))) {
rb_yield(str
}
return obj;
}
each_byte() Show source
有关说明,请参阅 Zlib :: GzipReader 文档。
static VALUE
rb_gzreader_each_byte(VALUE obj)
{
VALUE c;
RETURN_ENUMERATOR(obj, 0, 0
while (!NIL_P(c = rb_gzreader_getbyte(obj))) {
rb_yield(c
}
return Qnil;
}
each_char() Show source
有关说明,请参阅 Zlib :: GzipReader 文档。
static VALUE
rb_gzreader_each_char(VALUE obj)
{
VALUE c;
RETURN_ENUMERATOR(obj, 0, 0
while (!NIL_P(c = rb_gzreader_getc(obj))) {
rb_yield(c
}
return Qnil;
}
each_line(*args) Show source
有关说明,请参阅 Zlib :: GzipReader 文档。
static VALUE
rb_gzreader_each(int argc, VALUE *argv, VALUE obj)
{
VALUE str;
RETURN_ENUMERATOR(obj, 0, 0
while (!NIL_P(str = gzreader_gets(argc, argv, obj))) {
rb_yield(str
}
return obj;
}
eof() Show source
返回true
或false
流是否已达到结尾。
static VALUE
rb_gzfile_eof_p(VALUE obj)
{
struct gzfile *gz = get_gzfile(obj
return GZFILE_IS_FINISHED(gz) ? Qtrue : Qfalse;
}
eof?() Show source
返回true
或false
流是否已达到结尾。
static VALUE
rb_gzfile_eof_p(VALUE obj)
{
struct gzfile *gz = get_gzfile(obj
return GZFILE_IS_FINISHED(gz) ? Qtrue : Qfalse;
}
external_encoding() Show source
有关说明,请参阅 Zlib :: GzipReader 文档。
static VALUE
rb_gzreader_external_encoding(VALUE self)
{
return rb_enc_from_encoding(get_gzfile(self)->enc
}
getbyte() Show source
有关说明,请参阅 Zlib :: GzipReader 文档。
static VALUE
rb_gzreader_getbyte(VALUE obj)
{
struct gzfile *gz = get_gzfile(obj
VALUE dst;
dst = gzfile_read(gz, 1
if (!NIL_P(dst)) {
dst = INT2FIX((unsigned int)(RSTRING_PTR(dst)[0]) & 0xff
}
return dst;
}
getc() Show source
有关说明,请参阅 Zlib :: GzipReader 文档。
static VALUE
rb_gzreader_getc(VALUE obj)
{
struct gzfile *gz = get_gzfile(obj
return gzfile_getc(gz
}
gets(*args) Show source
有关说明,请参阅 Zlib :: GzipReader 文档。
static VALUE
rb_gzreader_gets(int argc, VALUE *argv, VALUE obj)
{
VALUE dst;
dst = gzreader_gets(argc, argv, obj
if (!NIL_P(dst)) {
rb_lastline_set(dst
}
return dst;
}
lineno() Show source
从该文件读取的最后一行的行号。
static VALUE
rb_gzfile_lineno(VALUE obj)
{
return INT2NUM(get_gzfile(obj)->lineno
}
lineno=(p1) Show source
指定从此文件读取的最后一行的行号。
static VALUE
rb_gzfile_set_lineno(VALUE obj, VALUE lineno)
{
struct gzfile *gz = get_gzfile(obj
gz->lineno = NUM2INT(lineno
return lineno;
}
lines(*args) Show source
这是一个不推荐的别名each_line
。
static VALUE
rb_gzreader_lines(int argc, VALUE *argv, VALUE obj)
{
rb_warn("Zlib::GzipReader#lines is deprecated; use #each_line instead"
if (!rb_block_given_p())
return rb_enumeratorize(obj, ID2SYM(rb_intern("each_line")), argc, argv
return rb_gzreader_each(argc, argv, obj
}
pos() Show source
到目前为止输出字节的总数。
static VALUE
rb_gzfile_total_out(VALUE obj)
{
struct gzfile *gz = get_gzfile(obj
return rb_uint2inum(gz->z.stream.total_out - gz->z.buf_filled
}
read(p1 = v1) Show source
有关说明,请参阅 Zlib :: GzipReader 文档。
static VALUE
rb_gzreader_read(int argc, VALUE *argv, VALUE obj)
{
struct gzfile *gz = get_gzfile(obj
VALUE vlen;
long len;
rb_scan_args(argc, argv, "01", &vlen
if (NIL_P(vlen)) {
return gzfile_read_all(gz
}
len = NUM2INT(vlen
if (len < 0) {
rb_raise(rb_eArgError, "negative length %ld given", len
}
return gzfile_read(gz, len
}
readbyte() Show source
有关说明,请参阅 Zlib :: GzipReader 文档。
static VALUE
rb_gzreader_readbyte(VALUE obj)
{
VALUE dst;
dst = rb_gzreader_getbyte(obj
if (NIL_P(dst)) {
rb_raise(rb_eEOFError, "end of file reached"
}
return dst;
}
readchar() Show source
有关说明,请参阅 Zlib :: GzipReader 文档。
static VALUE
rb_gzreader_readchar(VALUE obj)
{
VALUE dst;
dst = rb_gzreader_getc(obj
if (NIL_P(dst)) {
rb_raise(rb_eEOFError, "end of file reached"
}
return dst;
}
readline(*args) Show source
有关说明,请参阅 Zlib :: GzipReader 文档。
static VALUE
rb_gzreader_readline(int argc, VALUE *argv, VALUE obj)
{
VALUE dst;
dst = rb_gzreader_gets(argc, argv, obj
if (NIL_P(dst)) {
rb_raise(rb_eEOFError, "end of file reached"
}
return dst;
}
readlines(*args) Show source
有关说明,请参阅 Zlib :: GzipReader 文档。
static VALUE
rb_gzreader_readlines(int argc, VALUE *argv, VALUE obj)
{
VALUE str, dst;
dst = rb_ary_new(
while (!NIL_P(str = gzreader_gets(argc, argv, obj))) {
rb_ary_push(dst, str
}
return dst;
}
readpartial(maxlen , outbuf) → string, outbuf Show source
从 gziped 流中读取至多 maxlen 字节,但仅当 gzipreader 没有立即可用数据时才会阻止。如果可选的 outbuf 参数存在,它必须引用一个 String,它将接收数据。它EOFError
在文件结尾处引发。
static VALUE
rb_gzreader_readpartial(int argc, VALUE *argv, VALUE obj)
{
struct gzfile *gz = get_gzfile(obj
VALUE vlen, outbuf;
long len;
rb_scan_args(argc, argv, "11", &vlen, &outbuf
len = NUM2INT(vlen
if (len < 0) {
rb_raise(rb_eArgError, "negative length %ld given", len
}
if (!NIL_P(outbuf))
Check_Type(outbuf, T_STRING
return gzfile_readpartial(gz, len, outbuf
}
rewind() Show source
将文件指针的位置重置为创建 GzipReader 对象的点。关联的 IO 对象需要响应该seek
方法。
static VALUE
rb_gzreader_rewind(VALUE obj)
{
struct gzfile *gz = get_gzfile(obj
gzfile_reader_rewind(gz
return INT2FIX(0
}
tell() Show source
到目前为止输出字节的总数。
static VALUE
rb_gzfile_total_out(VALUE obj)
{
struct gzfile *gz = get_gzfile(obj
return rb_uint2inum(gz->z.stream.total_out - gz->z.buf_filled
}
ungetbyte(p1) Show source
有关说明,请参阅 Zlib :: GzipReader 文档。
static VALUE
rb_gzreader_ungetbyte(VALUE obj, VALUE ch)
{
struct gzfile *gz = get_gzfile(obj
gzfile_ungetbyte(gz, NUM2CHR(ch)
return Qnil;
}
ungetc(p1) Show source
有关说明,请参阅 Zlib :: GzipReader 文档。
static VALUE
rb_gzreader_ungetc(VALUE obj, VALUE s)
{
struct gzfile *gz;
if (FIXNUM_P(s))
return rb_gzreader_ungetbyte(obj, s
gz = get_gzfile(obj
StringValue(s
if (gz->enc2 && gz->enc2 != rb_ascii8bit_encoding()) {
s = rb_str_conv_enc(s, rb_enc_get(s), gz->enc2
}
gzfile_ungets(gz, (const Bytef*)RSTRING_PTR(s), RSTRING_LEN(s)
RB_GC_GUARD(s
return Qnil;
}
unused() Show source
返回为解析 gzip 格式而读取的其余数据,或者nil
如果尚未分析整个 gzip 文件。
static VALUE
rb_gzreader_unused(VALUE obj)
{
struct gzfile *gz;
TypedData_Get_Struct(obj, struct gzfile, &gzfile_data_type, gz
return gzfile_reader_get_unused(gz
}