class Zlib::ZStream
Zlib::ZStream 是处理压缩数据的流的抽象类。操作在子类中定义:Zlib::Deflate 用于压缩,Zlib::Inflate 用于解压缩。
一个 Zlib::ZStream 实例包含一个流(源中的 struct zstream)和两个可变长度的缓冲区,它们分别与流的输入 (next_in) 和输出 (next_out) 相关联。在本文档中,“输入缓冲区”表示用于输入的缓冲区,“输出缓冲区”表示用于输出的缓冲区。
输入到 Zlib::ZStream 实例的 Data 会暂时存储在输入缓冲区的末尾,然后从缓冲区的开头处理输入缓冲区中的数据,直到不再从流中产生输出(即,在处理后 avail_out > 0)。在处理过程中,输出缓冲区会被自动分配和扩展以容纳所有输出数据。
一些特定的实例方法会消耗输出缓冲区中的数据,并将它们作为 String 返回。
下面是一个用于描述上述情况的 ASCII 图:
+================ an instance of Zlib::ZStream ================+
|| ||
|| +--------+ +-------+ +--------+ ||
|| +--| output |<---------|zstream|<---------| input |<--+ ||
|| | | buffer | next_out+-------+next_in | buffer | | ||
|| | +--------+ +--------+ | ||
|| | | ||
+===|======================================================|===+
| |
v |
"output data" "input data"
如果在处理输入缓冲区时发生错误,将引发一个 Zlib::Error 的子类异常。此时,输入和输出缓冲区将保持错误发生时的状态。
方法目录
此类中的许多方法都相当底层,用户不太可能对其感兴趣。事实上,用户不太可能直接使用此类;他们更关心 Zlib::Inflate 和 Zlib::Deflate。
上面列出了更高级别的方法。
Public Instance Methods
Source
static VALUE
rb_zstream_adler(VALUE obj)
{
return rb_uint2inum(get_zstream(obj)->stream.adler);
}
返回 adler-32 校验和。
Source
static VALUE
rb_zstream_avail_in(VALUE obj)
{
struct zstream *z;
TypedData_Get_Struct(obj, struct zstream, &zstream_data_type, z);
return INT2FIX(NIL_P(z->input) ? 0 : (int)(RSTRING_LEN(z->input)));
}
返回输入缓冲区中的字节数。通常返回 0。
Source
static VALUE
rb_zstream_avail_out(VALUE obj)
{
struct zstream *z;
TypedData_Get_Struct(obj, struct zstream, &zstream_data_type, z);
return rb_uint2inum(z->stream.avail_out);
}
返回输出缓冲区中可用空间的字节数。因为可用空间会自动分配,所以此方法通常返回 0。
Source
static VALUE
rb_zstream_set_avail_out(VALUE obj, VALUE size)
{
struct zstream *z = get_zstream(obj);
zstream_expand_buffer_into(z, FIX2INT(size));
return size;
}
在输出缓冲区中分配 size 字节的可用空间。如果缓冲区中已有的字节数超过 size,则缓冲区将被截断。因为可用空间会自动分配,所以您通常不需要使用此方法。
Source
static VALUE
rb_zstream_end(VALUE obj)
{
zstream_end(get_zstream(obj));
return Qnil;
}
关闭流。对已关闭的流的所有操作都将引发异常。
Source
static VALUE
rb_zstream_closed_p(VALUE obj)
{
struct zstream *z;
TypedData_Get_Struct(obj, struct zstream, &zstream_data_type, z);
return ZSTREAM_IS_READY(z) ? Qfalse : Qtrue;
}
如果流已关闭,则返回 true。
Source
static VALUE
rb_zstream_data_type(VALUE obj)
{
return INT2FIX(get_zstream(obj)->stream.data_type);
}
猜测已输入到流中的数据的类型。返回值是 BINARY、ASCII 或 UNKNOWN 之一。
Source
static VALUE
rb_zstream_finish(VALUE obj)
{
struct zstream *z = get_zstream(obj);
zstream_run(z, (Bytef*)"", 0, Z_FINISH);
return zstream_detach_buffer(z);
}
完成流并刷新输出缓冲区。如果提供了块,则每个块都会被传递给该块,直到输入缓冲区被刷新到输出缓冲区。
Source
static VALUE
rb_zstream_finished_p(VALUE obj)
{
return ZSTREAM_IS_FINISHED(get_zstream(obj)) ? Qtrue : Qfalse;
}
如果流已完成,则返回 true。
Source
static VALUE
rb_zstream_flush_next_in(VALUE obj)
{
struct zstream *z;
VALUE dst;
TypedData_Get_Struct(obj, struct zstream, &zstream_data_type, z);
dst = zstream_detach_input(z);
return dst;
}
刷新输入缓冲区并返回该缓冲区中的所有数据。
Source
static VALUE
rb_zstream_flush_next_out(VALUE obj)
{
struct zstream *z;
TypedData_Get_Struct(obj, struct zstream, &zstream_data_type, z);
return zstream_detach_buffer(z);
}
刷新输出缓冲区并返回该缓冲区中的所有数据。如果提供了块,则每个块都会被传递给该块,直到当前输出缓冲区被刷新。
Source
static VALUE
rb_zstream_reset(VALUE obj)
{
zstream_reset(get_zstream(obj));
return Qnil;
}
重置并初始化流。输入和输出缓冲区中的所有数据都将被丢弃。
Source
static VALUE
rb_zstream_total_in(VALUE obj)
{
return rb_uint2inum(get_zstream(obj)->stream.total_in);
}
返回流的输入数据的总字节数。FIXME
Source
static VALUE
rb_zstream_total_out(VALUE obj)
{
return rb_uint2inum(get_zstream(obj)->stream.total_out);
}
返回流的输出数据的总字节数。FIXME