Spec-Zone.ru › Ruby 3.4

класс Zlib::GzipReader

Родитель:
Zlib::GzipFile
Включенные модули:
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

Method Каталог

Следующие методы в Zlib::GzipReader аналогичны своим аналогам в IO, но они генерируют исключение Zlib::Error или Zlib::GzipFile::Error, если в файле gzip была обнаружена ошибка.

  • 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.

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

  • Когда вызывается метод 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 читает сжатые gzip данные из 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 потоков не должно быть никаких других данных.

Если предоставлен блок, он принимает строки распакованных данных, и метод возвращает 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 документацию для описания.

END_OF_DOCUMENT_MARKER
readpartial(maxlen [, outbuf]) → строка, 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–2024 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

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