Delphi支持流,流包括文件、字符串、內存、二進制塊、套接字、嵌入式對象等數據源。
Delphi定義TStream類作為所有流類的父類,TStream類有多個子類,每個子類分別處理特定的一種流
。
9.4.2 TStream類
TStream類是所有流類的父類,其中定義了所有流的共同屬性和方法。TStream是抽象類,不能創建該類的實例。TStream類定義在Classes單元中。
1.TStream類的屬性
對流的讀/寫操作,每次所能讀出/寫入的字節數取決於流對象自身的大小,而讀出/寫入的數據與流對象中當前數據位置有關。
因此,TStream類定義了兩個屬性Size與Position,Size屬性指定流對象的大小,Position屬性為在流中進行讀/寫操作指定當前位置。
2.TStream類的方法
作為所有實際使用的所有流類的共同父類,
TStream類設計成抽象類,為所有子類提供共同的屬性和方法聲明。
故TStream類中定義的方法大部分是虛方法和抽象方法,沒有給出這些方法的具體實現,而必須由子類根據不同流的特性給出方法的具體實現。
TStream中定義的方法說明如下。
(1)Read虛方法。
該方法從流中讀取指定數目的字節數據到緩沖區,並自動控制流指針的位置。聲明 如下:
function Read(var Buffer; Count: Longint): Longint;virtual; abstract;
其中,參數Buffer為數據讀出時存放的緩沖區,Count為需要讀取數據的字節數,該方法返回值為實際讀取的字節數,它可以小於或等於Count中指定的值。
(2)Write虛方法。
Write虛方法從緩沖區向流中寫指定數目的字節數據,流指針自動移位。聲明如下:
function Write(var Buffer; Count: Longint): Longint; virtual; abstract;
其中,參數Buffer為將要寫入流的數據緩沖區,Count為數據的長度字節數,該方法返回值為實際寫入流中的字節數。
(3)Seek虛方法。
Seek虛方法將文件流指針移動若干位置,返回移動後的指針位置。聲明如下:
function Seek(Offset: Longint; Origin: Word): Longint; overload; virtual;
其中,Offset參數為移動字節數,Origin指定文件流指針的起始位置,Origin的取值和意義見表9-2。
表9-2 Origin的取值和意義
取 值
常 量 值
意 義
soFromBeginning
1
文件流的開始位置
soFromCurrent
2
文件流的當前位置
soFromEnd
3
文件流的結尾位置
(4)CopyFrom方法。
CopyFrom方法從指定文件流中復制指定數目的字節,並自動移動文件流指針,返回實際復制的字節數。聲明如下:
function CopyFrom(source: TStream; count: LongInt): LongInt;
其中,source參數為源數據流,count為待復制的字節數。當count>0時,CopyFrom從source的當前位置復制count字節;當count=0時,CopyFrom復制source的所有數據,並設置source的Position屬性為0。
(5)WriteComponent方法。
WriteComponent方法將組件的初始化及屬性信息寫入流中。方法聲明如下:
procedure WriteComponent(Instance: TComponent);
3.TStream類的子類
TStream類是抽象類,提供流操作的共同屬性和方法,而沒有提供對數據保存的直接支持。
TStream類的子類表示特定的流類,每個子類分別處理一種流。
實際使用時,根據數據的性質,創建TStream類的子類對象。例如,使用TFileStream類進行文件操作,使用TMemoryStream類處理內存中的流。
從TStream類繼承的子類必須覆蓋Read、Write和Seek等虛方法,實現數據流的具體操作。TStream類的子類說明如下:
(1)TFileStream文件流,用於磁盤文件的讀寫操作。
(2)TStringStream字符串流,提供類似文件操作方式從長字符串中讀寫信息。
(3)TMemoryStream內存流,用於動態內存中的數據流的讀寫操作。
(4)TBlobStream塊操作流,提供blob類型的數據流的讀寫操作。
(5)TwinSocketStream,用於以Socket方式連接的數據流的讀寫操作。
(6)TOleStream,為嵌入式對象提供數據流的讀寫操作。
9.4.3 TFileStream類
TFileStream類是TStream類的子類,它繼承了TStream類的屬性和方法。使用TFileStream類進行文件存取操作,首先要建立TFileStream類的實例。其構造方法Create聲明如下:
constructor Create(const FileName; string; Mode: Word);
其中,參數FileName為包括路徑的文件全名;Mode為文件打開方式,包括打開模式和共享模式,其取值和含義見表9-3。
表9-3 Mode參數的取值和含義
模 式
取 值
含 義
打開模式
fmCreate
用指定的文件名打開它,若文件已存在則打開
fmOpenRead
以只讀方式打開指定文件
fmOpenWrite
以只寫方式打開指定文件
fmOpenRreadWrite
以讀寫方式打開指定文件
共享模式
fmShareCompat
共享模式與FCBs相兼容
fmShareExclusive
獨占方式打開指定文件
fmShareDenyWrite
不允許別的程序以寫的方式打開
fmShareDenyRead
不允許別的程序以讀的方式打開
fmShareDenyNone
別的程序可以任何方式打開
例如,希望以只讀的方式打開'E:\Temp\A.dat'文件,且不允許其他程序同時對該文件進行寫操作,創建TFileStream類實例的語句如下:
f=TFileStream.Create('E:\Temp\A.dat', fmOpenRead or fmShareDenyWrite);
如果不指定共享模式,則默認值為fmShareExclusive。如果打開文件失敗,則產生異常。
TFileStream類的Read、Write、CopyFrom等方法覆蓋父類TStream的同名方法,實現文件的讀、寫、復制等操作。操作結束後,必須釋放文件對象,以釋放資源和數據緩沖區。
9.4.4 讀/寫流的類方法
許多類提供從流中讀/寫數據的LoadFromStream( )和SaveToStream( )方法,聲明如下:
procedure LoadFromStream(Stream:TStream);
procedure SaveToStream(Stream:TStream);
其中,Stream可以為TStream子類的任何對象。
擁有這兩個讀寫流方法的類有TStrings類、TGraphic類及其子類TBitmap、TIcon類、TPicture類和TMemoryStream類