20.1.2 THandleStream對象
THandleStream對象的行為特別象FileStream對象,所不同的是它通過已創建的文件句柄而不是文件名來存儲流中的數據。
THandleStream對象定義了Handle屬性,該屬性提供了對文件句柄的只讀訪問,並且Handle屬性可以作為Delphi的RTL文件管理函數的參數,利用文件類函數來讀寫數據。THandleStream覆蓋了構造函數Create,該函數帶有Handle 參數,該參數指定與THandleStream對象相關的文件句柄。
20.1.2.1 THandleStream的屬性的方法:
1. Handle屬性
聲明:property Handle: Integer;
Handle屬性提供了對文件句柄的只讀訪問,該句柄由THandleStream的構造方法Create傳入。因此除了用THandleStream提供的方法外,也可以用文件管理函數對句柄進行操作。實際上,THandleStream的方法在實現上也是運用文件管理函數進行實際的讀寫操作。
2. Create方法
聲明:constructor Create(AHandle: Integer);
Create方法使用傳入的Handle參數創建一個與特定文件句柄相聯的THandleStream對象,並且將AHandle賦給流的Handle屬性。
3. Read、Write和Seek方法
這三個方法是TStream的虛方法,只是在THandleStream 中覆蓋了這三個方法,以實現特定媒介──文件的數據存取。後面會詳細介紹這三個方法的實現。
20.1.2.2 THandleStream的實現原理
THandleStream是從TStream繼承來的,因此可以共用TStream中的屬性和大多數方法。THandleStream在實現上主要是增加了一個屬性Handle和覆蓋了Create、Read、Write和Seek四個方法。
1. 屬性的實現
Handle屬性的實現正如Delphi大多數屬性的實現那樣,先在對象定義的private部分聲明一個存放數據的變量FHandle,然後在定義的public部分聲明屬性Handle,其中屬性定義的讀寫控制部分加上只讀控制,讀控制只是直接讀取FHandle變量的值,其實現如下:
THandleStream = class(TStream)
private
FHandle: Integer;
public
…
property Handle: Integer read FHandle;
end;
2. 方法的實現
THandleStream的Create方法,以AHandle作為參數,在方法裡面只是簡單的將AHandle的值賦給FHandle,其實現如下:
constructor THandleStream.Create(AHandle: Integer);
begin
FHandle := AHandle;
end;
為實現針對文件的數據對象存儲,THandleStream的Read、Write和Seek方法覆蓋了TStream中的相應方法。它們的實現都調用了Windows的文件管理函數。
Read方法調用FileRead函數實現文件讀操作,其實現如下:
function THandleStream.Read(var Buffer; Count: Longint): Longint;
begin
Result := FileRead(FHandle, Buffer, Count);
if Result = -1 then Result := 0;
end;
Write方法調用FileWrite函數實現文件寫操作,其實現如下:
function THandleStream.Write(const Buffer; Count: Longint): Longint;
begin
Result := FileWrite(FHandle, Buffer, Count);
if Result = -1 then Result := 0;
end;
Seek方法調用FileSeek函數實現文件指針的移動,其實現如下:
function THandleStream.Seek(Offset: Longint; Origin: Word): Longint;
begin
Result := FileSeek(FHandle, Offset, Origin);
end;
20.1.3 TFileStream對象
TFileStream對象是在磁盤文件上存儲數據的Stream對象。TFileStream是從THandleStream繼承下來的,它和THandleStream一樣都是實現文件的存取操作。不同之處在於THandleStream用句柄訪問文件,而TFileStream用文件名訪問文件。實際上TFileStream是THandleStream上的一層包裝,其內核是THandleStream的屬性和方法。
TFileStream中沒有增加新的屬性和方法。它只是覆蓋了的構造方法Create和析構方法Destory。在Create方法中帶兩個參數FileName和Mode。FileName描述要創建或打開的文件名,而Mode描述文件模式如fmCreate、fmOpenRead和fmOpenWrite等。Create方法首先使用FileCreate或FileOpen函數創建或打開名為FileName的文件,再將得到的文件句柄賦給FHandle。TFileStream的文件讀寫操作都是由從THandleStream繼承的Read
var
Stream: TStream;
begin
Stream := TFileStream.Create(FileName, fmCreate);
try
SaveToStream(Stream);
finally
Stream.Free;
end;
end;
在Delphi 的許多對象的SaveToStream 和SaveToFile、LoadFromStream和LoadFromFile方法的實現都有類似的嵌套結構。
20.1.5 TMemoryStream對象
TMemoryStream對象是一個管理動態內存中的數據的Stream對象,它是從TCustomMemoryStream中繼承下來的,除了從TCustomMemoryStream中繼承的屬性和方法外,它還增加和覆蓋了一些用於從磁盤文件和其它注台讀數據的方法。它還提供了寫入、消除內存內容的動態內存管理方法。下面介紹它的這些屬性和方法。
20.1.5.1 TMemoryStream的屬性和方法
1. Capacity屬性
聲明:property Copacity: Longint;
Capacity屬性決定了分配給內存流的內存池的大小。這與Size屬性有些不同。Size屬性是描述流中數據的大小。在程序中可以將Capacity 的值設置的比數據所需最大內存大一些,這樣可以避免頻繁地重新分配。
2. Realloc方法
聲明:function Realloc(var NewCapacity: Longint): Pointer; virtual;
Realloc方法,以8K為單位分配動態內存,內存的大小由NewCapacity指定,函數返回指向所分配內存的指針。
3. SetSize方法
SetSize方法消除內存流中包含的數據,並將內存流中內存池的大小設為Size字節。如果Size為零,是SetSize方法將釋放已有的內存池,並將Memory屬性置為nil;否則,SetSize方法將內存池大小調整為Size。
4. Clear方法
聲明:procedure Clear;
Clear方法釋放內存中的內存池,並將Memory屬性置為nil。在調用Clear方法後,Size和Position屬性都為0。
5. LoadFromStream方法
聲明:procedure LoadFromStream(Stream: TStream);
LoadFromStream方法將Stream指定的流中的全部內容復制到MemoryStream中,復制過程將取代已有內容,使MemoryStream成為Stream的一份拷貝。
6. LoadFromFile方法
聲明:procedure LoadFromFile(count FileName: String);
LoadFromFile方法將FileName指定文件的所有內容復制到MemoryStream中,並取代已有內容。調用LoadFromFile方法後,MemoryStream將成為文件內容在內存中的完整拷貝。