Spec-Zone.ru › Ruby 4.0
  1. Zlib::
  2. GzipReader

класс Zlib::GzipReader

Родительский класс:
Zlib::GzipFile
Подключённые модули:
Enumerable

Zlib::GzipReader — класс для чтения файла в формате gzip. GzipReader следует использовать как объект типа 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.

  • При поступлении запроса на чтение за концом файла (концом сжатых данных). То есть когда Zlib::GzipReader#read, Zlib::GzipReader#gets или некоторые другие методы чтения возвращают nil.

  • Когда после достижения концa файла объектом вызывается метод Zlib::GzipFile#close.

  • Когда после достижения концa файла объектом вызывается метод Zlib::GzipReader#unused.

Остальные методы достаточно подробно описаны в собственной документации.

Открытые методы класса

Zlib::GzipReader.new(io, options = {}) Показать исходный код
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, Qnil);
    rb_gzfile_ecopts(gz, opt);

    if (rb_respond_to(io, id_path)) {
        /* File#path may raise IOError in case when a path is unavailable */
        rb_rescue2(gzfile_initialize_path_partial, obj, NULL, Qnil, rb_eIOError, (VALUE)0);
    }

    return obj;
}

Создаёт объект GzipReader, связанный с io. Объект GzipReader читает сжатые данные из io и анализирует/распаковывает их. У io должен быть метод read, который ведёт себя так же, как IO#read.

Хеш options можно использовать для задания кодировки данных. :external_encoding, :internal_encoding и :encoding можно задать так же, как в IO::new.

Если заголовок файла gzip некорректен, вызывается исключение Zlib::GzipFile::Error.

Zlib::GzipReader.open(filename) {|gz| ... } Показать исходный код
static VALUE
rb_gzreader_s_open(int argc, VALUE *argv, VALUE klass)
{
    return gzfile_s_open(argc, argv, klass, "rb");
}

Открывает файл, указанный в filename, как файл gzip и возвращает объект GzipReader, связанный с этим файлом. Дополнительные сведения об этом методе см. в Zlib::GzipReader.new и ZLib::GzipFile.wrap.

Zlib::GzipReader.zcat(io, options = {}, &block) → nil Показать исходный код
Zlib::GzipReader.zcat(io, options = {}) → string
static VALUE
rb_gzreader_s_zcat(int argc, VALUE *argv, VALUE klass)
{
    VALUE io, unused, obj, buf=0, tmpbuf;
    long pos;

    rb_check_arity(argc, 1, 2);
    io = argv[0];

    do {
        obj = rb_funcallv(klass, rb_intern("new"), argc, argv);
        if (rb_block_given_p()) {
           rb_gzreader_each(0, 0, obj);
        }
        else {
            if (!buf) {
                buf = rb_str_new(0, 0);
            }
            tmpbuf = gzfile_read_all(get_gzfile(obj), Qnil);
            rb_str_cat(buf, RSTRING_PTR(tmpbuf), RSTRING_LEN(tmpbuf));
        }

        rb_gzreader_read(0, 0, obj);
        pos = NUM2LONG(rb_funcall(io, rb_intern("pos"), 0));
        unused = rb_gzreader_unused(obj);
        rb_gzfile_finish(obj);
        if (!NIL_P(unused)) {
            pos -= NUM2LONG(rb_funcall(unused, rb_intern("length"), 0));
            rb_funcall(io, rb_intern("pos="), 1, LONG2NUM(pos));
        }
    } while (pos < NUM2LONG(rb_funcall(io, rb_intern("size"), 0)));

    if (rb_block_given_p()) {
        return Qnil;
    }
    return buf;
}

Распаковывает все данные gzip в io, обрабатывая несколько потоков gzip до конца io. После потоков gzip не должно быть никаких данных, не относящихся к gzip.

Если передан блок, ему передаются строки распакованных данных, а метод возвращает nil. Если блок не передан, метод возвращает объединение всех распакованных данных из всех потоков gzip.

Открытые методы экземпляра

each (*args) Показать исходный код
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;
}

Описание см. в документации Zlib::GzipReader.

Также имеет псевдоним: each_line
each_byte () Показать исходный код
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;
}

Описание см. в документации Zlib::GzipReader.

each_char () Показать исходный код
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;
}

Описание см. в документации Zlib::GzipReader.

each_line (*args)

Описание см. в документации Zlib::GzipReader.

Псевдоним для: each
eof () Показать исходный код
static VALUE
rb_gzfile_eof_p(VALUE obj)
{
    struct gzfile *gz = get_gzfile(obj);
    while (!ZSTREAM_IS_FINISHED(&gz->z) && ZSTREAM_BUF_FILLED(&gz->z) == 0) {
        gzfile_read_more(gz, Qnil);
    }
    return GZFILE_IS_FINISHED(gz) ? Qtrue : Qfalse;
}

Возвращает true или false в зависимости от того, достиг ли поток конца.

Также имеет псевдоним: eof?
eof? ()

Возвращает true или false в зависимости от того, достиг ли поток конца.

Псевдоним для: eof
external_encoding () Показать исходный код
static VALUE
rb_gzreader_external_encoding(VALUE self)
{
    return rb_enc_from_encoding(get_gzfile(self)->enc);
}

Описание см. в документации Zlib::GzipReader.

getbyte () Показать исходный код
static VALUE
rb_gzreader_getbyte(VALUE obj)
{
    struct gzfile *gz = get_gzfile(obj);
    VALUE dst;

    dst = gzfile_read(gz, 1, Qnil);
    if (!NIL_P(dst)) {
        dst = INT2FIX((unsigned int)(RSTRING_PTR(dst)[0]) & 0xff);
    }
    return dst;
}

Описание см. в документации Zlib::GzipReader.

getc () Показать исходный код
static VALUE
rb_gzreader_getc(VALUE obj)
{
    struct gzfile *gz = get_gzfile(obj);

    return gzfile_getc(gz);
}

Описание см. в документации Zlib::GzipReader.

gets (*args) Показать исходный код
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;
}

Описание см. в документации Zlib::GzipReader. Однако учтите, что этот метод может возвращать nil, даже если eof? возвращает false, в отличие от поведения File#gets.

lineno () Показать исходный код
static VALUE
rb_gzfile_lineno(VALUE obj)
{
    return INT2NUM(get_gzfile(obj)->lineno);
}

Номер последней строки, прочитанной из этого файла.

lineno= (p1) Показать исходный код
static VALUE
rb_gzfile_set_lineno(VALUE obj, VALUE lineno)
{
    struct gzfile *gz = get_gzfile(obj);
    gz->lineno = NUM2INT(lineno);
    return lineno;
}

Задаёт номер последней строки, прочитанной из этого файла.

pos () Показать исходный код
static VALUE
rb_gzfile_total_out(VALUE obj)
{
    struct gzfile *gz = get_gzfile(obj);
    uLong total_out = gz->z.stream.total_out;
    long buf_filled = ZSTREAM_BUF_FILLED(&gz->z);

    if (total_out >= (uLong)buf_filled) {
        return rb_uint2inum(total_out - buf_filled);
    } else {
        return LONG2FIX(-(buf_filled - (long)total_out));
    }
}

Общее количество выведенных на данный момент байтов.

Также имеет псевдоним: tell
read (p1 = v1, p2 = v2) Показать исходный код
static VALUE
rb_gzreader_read(int argc, VALUE *argv, VALUE obj)
{
    struct gzfile *gz = get_gzfile(obj);
    VALUE vlen, outbuf;
    long len;

    rb_scan_args(argc, argv, "02", &vlen, &outbuf);
    if (NIL_P(vlen)) {
        return gzfile_read_all(gz, outbuf);
    }

    len = NUM2INT(vlen);
    if (len < 0) {
        rb_raise(rb_eArgError, "negative length %ld given", len);
    }
    return gzfile_read(gz, len, outbuf);
}

Описание см. в документации Zlib::GzipReader.

readbyte () Показать исходный код
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;
}

Описание см. в документации Zlib::GzipReader.

readchar () Показать исходный код
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;
}

Описание см. в документации Zlib::GzipReader.

readline (*args) Показать исходный код
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;
}

Описание см. в документации Zlib::GzipReader.

readlines (*args) Показать исходный код
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;
}

Описание см. в документации Zlib::GzipReader.

readpartial(maxlen [, outbuf]) → string, outbuf Показать исходный код
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);
}

Читает не более maxlen байтов из потока gzip, блокируясь только в том случае, если данные для gzipreader недоступны немедленно. Если указан необязательный аргумент outbuf, он должен ссылаться на String, в который будут записаны данные. При достижении конца файла вызывается исключение EOFError.

rewind () Показать исходный код
static VALUE
rb_gzreader_rewind(VALUE obj)
{
    struct gzfile *gz = get_gzfile(obj);
    gzfile_reader_rewind(gz);
    return INT2FIX(0);
}

Сбрасывает позицию указателя файла в точку, в которой был создан объект GzipReader. Связанный объект IO должен поддерживать метод seek.

tell ()

Общее количество выведенных на данный момент байтов.

Псевдоним для: pos
ungetbyte (p1) Показать исходный код
static VALUE
rb_gzreader_ungetbyte(VALUE obj, VALUE ch)
{
    struct gzfile *gz = get_gzfile(obj);
    gzfile_ungetbyte(gz, NUM2CHR(ch));
    return Qnil;
}

Описание см. в документации Zlib::GzipReader.

ungetc (p1) Показать исходный код
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;
}

Описание см. в документации Zlib::GzipReader.

unused () Показать исходный код
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);
}

Возвращает оставшиеся данные, прочитанные для анализа формата gzip, или nil, если файл gzip ещё не разобран полностью.

Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API