類別 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 子類別的例外狀況。此時,輸入緩衝區和輸出緩衝區都會維持發生錯誤時的狀態。

Method 目錄

此類別中的許多方法都相當低階,不太可能引起使用者的興趣。事實上,使用者不太可能直接使用此類別;相反地,他們會對 Zlib::InflateZlib::Deflate 感興趣。

較高階的方法如下所列。

公共實例方法

adler() 按一下以切換來源

傳回 adler-32 檢查碼。

static VALUE
rb_zstream_adler(VALUE obj)
{
    return rb_uint2inum(get_zstream(obj)->stream.adler);
}
avail_in() 按一下以切換來源

傳回輸入緩衝區中的資料位元組。通常傳回 0。

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)));
}
avail_out() 按一下以切換來源

傳回輸出緩衝區中可用空間的位元組數。由於可用空間會自動配置,因此這個方法通常傳回 0。

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);
}
avail_out=(p1) 按一下以切換來源

在輸出緩衝區中配置 size 位元組的可用空間。如果緩衝區中已超過 size 位元組,則會將緩衝區截斷。由於可用空間會自動配置,因此您通常不需要使用這個方法。

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;
}
close() 按一下以切換來源

關閉串流。對已關閉串流的所有操作都會引發例外狀況。

static VALUE
rb_zstream_end(VALUE obj)
{
    zstream_end(get_zstream(obj));
    return Qnil;
}
別名:end
closed?() 按一下以切換來源

如果串流已關閉,則傳回 true。

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;
}
別名:ended?
data_type() 按一下以切換來源

猜測已輸入串流中的資料類型。傳回的值可能是 BINARYASCIIUNKNOWN

static VALUE
rb_zstream_data_type(VALUE obj)
{
    return INT2FIX(get_zstream(obj)->stream.data_type);
}
end()

關閉串流。對已關閉串流的所有操作都會引發例外狀況。

別名:close
ended?()

如果串流已關閉,則傳回 true。

別名:closed?
finish → String 按一下以切換來源
finish { |chunk| ... } → nil

完成串流並清除輸出緩衝區。如果提供區塊,則會將每個區塊傳遞給區塊,直到輸入緩衝區已清除到輸出緩衝區。

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);
}
finished?() 按一下以切換來源

如果串流已完成,則傳回 true。

static VALUE
rb_zstream_finished_p(VALUE obj)
{
    return ZSTREAM_IS_FINISHED(get_zstream(obj)) ? Qtrue : Qfalse;
}
別名:stream_end?
flush_next_in → input 按一下以切換來源
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;
}
flush_next_out → String 按一下以切換來源
flush_next_out { |chunk| ... } → nil

清除輸出緩衝區並傳回該緩衝區中的所有資料。如果給定區塊,則會將每個區塊傳送給區塊,直到目前的輸出緩衝區已清除。

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);
}
reset() 按一下以切換來源

重設並初始化串流。輸入和輸出緩衝區中的所有資料都會捨棄。

static VALUE
rb_zstream_reset(VALUE obj)
{
    zstream_reset(get_zstream(obj));
    return Qnil;
}
stream_end?()

如果串流已完成,則傳回 true。

別名為:finished?
total_in() 按一下以切換來源

傳回串流中輸入資料的總位元組數。FIXME

static VALUE
rb_zstream_total_in(VALUE obj)
{
    return rb_uint2inum(get_zstream(obj)->stream.total_in);
}
total_out() 按一下以切換來源

傳回串流中輸出資料的總位元組數。FIXME

static VALUE
rb_zstream_total_out(VALUE obj)
{
    return rb_uint2inum(get_zstream(obj)->stream.total_out);
}