Delphi中壓縮流和解壓流的應(yīng)用

字號:

軟件開發(fā)者不免都要遇到壓縮數(shù)據(jù)的問題!經(jīng)常使用Delphi的朋友都知道,它為我們提供了兩個流類(TCompressionStream和TDecompressionStream)來完成數(shù)據(jù)的壓縮和解壓縮,但美中不足的是,該流在Delphi 的幫助中沒有詳細的說明,使得它們在使用起來有一定得困難。其實在Delphi系統(tǒng)中提供了這兩個類的源代碼和庫。保存在Delphi 光盤的\Info\Extras\Zlib\ Src和\Info\Extras\Zlib\Obj目錄中(其中OBJ目錄中保存的是庫,Src目錄中保存的是源代碼,感興趣的朋友可以看看)。本人在使用的過程中,對它們有了一定的了解。
    一、 類的說明
    1、 基類 TCustomZlibStream:類TCustomZlibStream 是類TCompressionStream和TDecompressionStream 類的基類,它主要有一個屬性: OnProgress,在類進行壓縮或解壓縮的過程中會發(fā)生這個的事件 ,它的定義如下:
    Procedure OnProgress (Sender: TObject); dynamic;
    2、 壓縮類TCompressionStream:類TCompressionStream除了繼承了基類的 OnProgress 屬性外,又增加了一個屬性:CompressionRate,它的定義如下:
    Property CompressionRate: Single read GetCompressionRate;通過這個屬性,可以得到壓縮比。
    它的幾個重要的方法定義如下:
    Constructor TCompressionStream.Create (CompressionLevel: TCompressionLevel; Dest: TStream);
    其中:TcompressionLevel(壓縮類型),它由如下幾個定義:
    ①、 clNone :不進行數(shù)據(jù)壓縮;
    ②、 clFastest:進行快速壓縮,犧牲壓縮效率;
    ③、 clDefault:進行正常壓縮;
    ④、 clMax: 進行化壓縮,犧牲速度;
    Dest:目的流,用于存放壓縮過的數(shù)據(jù)。
    Function TCompressionStream.Write (const Buffer; Count: Longint): Longint;
    其中:Buffer:需要壓縮的數(shù)據(jù);
    Count: 需要壓縮的數(shù)據(jù)的字節(jié)數(shù);
    函數(shù)返回寫入流的字節(jié)數(shù)。
    壓縮類TCompressionStream的數(shù)據(jù)只能是寫入的,如果試圖從其內(nèi)部讀取數(shù)據(jù),將發(fā)生一個"Error "異常。需要壓縮的數(shù)據(jù)通過方法 Write寫入流中,在寫入的過程中就被壓縮,并保存在由構(gòu)造函數(shù)提供的內(nèi)存流(TmemoryStream)中,同時觸發(fā) OnProcess 事件。
    3、 解壓縮類 TDecompressionStream :和壓縮類TcompressionStream 相反,它的數(shù)據(jù)是只能讀出的,如果試圖往其內(nèi)部寫數(shù)據(jù),將發(fā)生一個"Error "異常。它的幾個重要方法定義如下:
    構(gòu)造函數(shù):Constructor Create(Source: TStream);
    其中:Source 是保存著壓縮數(shù)據(jù)的流;
    Function Read(var Buffer; Count: Longint): Longint;
    數(shù)據(jù)讀出函數(shù),Buffer: 存數(shù)據(jù)緩沖區(qū);
    Count: 緩沖區(qū)的大?。?BR>    函數(shù)返回讀出的字節(jié)數(shù)。
    數(shù)據(jù)在讀出的過程中,數(shù)據(jù)被解壓縮,并觸發(fā) OnProcess 事件。