類別 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::Inflate
和 Zlib::Deflate
感興趣。
較高階的方法如下所列。
公共實例方法
傳回 adler-32 檢查碼。
static VALUE rb_zstream_adler(VALUE obj) { return rb_uint2inum(get_zstream(obj)->stream.adler); }
傳回輸入緩衝區中的資料位元組。通常傳回 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))); }
傳回輸出緩衝區中可用空間的位元組數。由於可用空間會自動配置,因此這個方法通常傳回 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); }
在輸出緩衝區中配置 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; }
關閉串流。對已關閉串流的所有操作都會引發例外狀況。
static VALUE rb_zstream_end(VALUE obj) { zstream_end(get_zstream(obj)); return Qnil; }
如果串流已關閉,則傳回 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; }
猜測已輸入串流中的資料類型。傳回的值可能是 BINARY
、ASCII
或 UNKNOWN
。
static VALUE rb_zstream_data_type(VALUE obj) { return INT2FIX(get_zstream(obj)->stream.data_type); }
完成串流並清除輸出緩衝區。如果提供區塊,則會將每個區塊傳遞給區塊,直到輸入緩衝區已清除到輸出緩衝區。
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); }
如果串流已完成,則傳回 true。
static VALUE rb_zstream_finished_p(VALUE obj) { return ZSTREAM_IS_FINISHED(get_zstream(obj)) ? Qtrue : Qfalse; }
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; }
清除輸出緩衝區並傳回該緩衝區中的所有資料。如果給定區塊,則會將每個區塊傳送給區塊,直到目前的輸出緩衝區已清除。
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); }
重設並初始化串流。輸入和輸出緩衝區中的所有資料都會捨棄。
static VALUE rb_zstream_reset(VALUE obj) { zstream_reset(get_zstream(obj)); return Qnil; }
傳回串流中輸入資料的總位元組數。FIXME
static VALUE rb_zstream_total_in(VALUE obj) { return rb_uint2inum(get_zstream(obj)->stream.total_in); }
傳回串流中輸出資料的總位元組數。FIXME
static VALUE rb_zstream_total_out(VALUE obj) { return rb_uint2inum(get_zstream(obj)->stream.total_out); }