Delphi流的操作
一、流的概念
流簡單說是建立在面向對象基礎上的一種抽象的處理數據的工具,它定義了一些處理數據的基本操作,如讀取數據,寫入數據等,程序員只需掌握對流進行操作,而不用關心流的另一頭數據的真正流向。其實,流就是把整個對象轉化爲一個一個單字節數據,然後形成數據流,其形同把固體石塊打碎成一顆顆細小的沙子一樣,最後可以形成流沙。
二、流的主要功能
流的主要功能是對文件與非文件數據相互轉換進行操作(即它們之間的I/O操作)。如將圖片文件保存到數據庫,那麼數據庫中的圖片數據就變成非文件數據了,它只屬於某記錄某字段的數據。而諸如網絡上傳輸的數據、內存中的存儲的數據等也都屬於非文件數據,這些數據要轉變成文件也需要流操作。
三、Delphi中流的基本概念及函數聲明
㈠流的屬性
在Delphi中,所有流對象的基類爲Tstream類,其中定義了所有流的共同屬性和方法。以下爲Tstream類中定義的屬性:
1.Size:此屬性以字節返回流中數據大小。
2.Position:此屬性控制流中存取指針的位置。
㈡Tstream定義的虛方法:
1. Read:此方法實現將數據從流中讀出。
函數原形爲:
Function Read(var Buffer;Count:Longint):Longint;virtual;abstract;
參數Buffer爲數據讀出時放置的緩衝區,Count爲需要讀出的數據的字節數,該方法返回值爲實際讀出的字節數,它可以小於或等於Count中指定的值。
2.Write:此方法實現將數據寫入流中。
函數原形爲:
Function Write(var Buffer;Count:Longint):Longint;virtual;abstract;
參數Buffer爲將要寫入流中的數據的緩衝區,Count爲數據的長度字節數,該方法返回值爲實際寫入流中的字節數。
3、Seek:此方法實現流中讀取指針的移動。
函數原形爲:
Function Seek(Offset:Longint;Origint:Word):Longint;virtual;abstract;
參數Offset爲偏移字節數,參數Origint指出Offset的實際意義,其可能的取值如下:
soFromBeginning:Offset爲移動後指針距離數據開始的位置。此時Offset必須大於或者等於零。
soFromCurrent:Offset爲移動後指針與當前指針的相對位置。
soFromEnd:Offset爲移動後指針距離數據結束的位置。此時Offset必須小於或者等於零。該方法返回值爲移動後指針的位置。
4、Setsize:此方法實現改變數據的大小。函數原形爲:
Function Setsize(NewSize:Longint);virtual;
㈢Tstream類定義的靜態方法:
1. ReadBuffer:此方法的作用是從流中當前位置讀取數據。
函數原形爲:
Procedure ReadBuffer(var Buffer;Count:Longint);
參數的定義跟上面的Read相同。注意:當讀取的數據字節數與需要讀取的字節數不相同時,將產生EReadError異常。
2. WriteBuffer:此方法的作用是在當前位置向流寫入數據。
函數原形爲:
Procedure WriteBuffer(var Buffer;Count:Longint);
參數的定義跟上面的Write相同。注意:當寫入的數據字節數與需要寫入的字節數不相同時,將產生EWriteError異常。
3. CopyFrom:此方法的作用是從其它流中拷貝數據流。
函數原形爲:
Function CopyFrom(Source:Tstream;Count:Longint):Longint;
參數Source爲提供數據的流,Count爲拷貝的數據字節數。當Count大於0時,CopyFrom從Source參數的當前位置拷貝Count個字節的數據;當Count等於0時,CopyFrom設置Source參數的Position屬性爲0,然後拷貝Source的所有數據;
㈣Tstream派生類
1. TFileStream類(文件流)。
使用TFileStream類來存取文件,首先要建立一個實例。聲明如下:
constructor Create(const Filename:string;Mode:Word);
Filename爲文件名(包括路徑),參數Mode爲打開文件的方式,它包括文件的打開模式和共享模式,其可能的取值和意義如下:
打開模式:
fmCreate :用指定的文件名建立文件,如果文件已經存在則打開它。
fmOpenRead :以只讀方式打開指定文件
fmOpenWrite :以只寫方式打開指定文件
fmOpenReadWrite:以寫寫方式打開指定文件
共享模式:
fmShareCompat :共享模式與FCBs兼容
fmShareExclusive:不允許別的程序以任何方式打開該文件
fmShareDenyWrite:不允許別的程序以寫方式打開該文件
fmShareDenyRead :不允許別的程序以讀方式打開該文件
fmShareDenyNone :別的程序可以以任何方式打開該文件
2. TmemoryStream類(內存流)
實際應用內存流使用也非常多,就是說在內存中建立一個流對象,它的基本方法和函數跟上面是一樣的。
Source:=TMemoryStream.Create;
3.TresourceStream(資源流)
資源流主要應用於對資源文件的操作。
㈤與流操作的一些相關函數和方法
1.sizeof(變量:Integer):獲得變量所佔空間的大小。
2.流類變量.SaveToFile(目標文件名):將流轉變爲文件保存。
3.其它類變量.SaveToStream(流類變量):將類變量內容轉變爲流。
4. 其它類變量.LoadFromFile(目標文件名):將文件加載到其它類變量。
5. 其它類變量.LoadFromStream(流類變量):將流類變量加載到其它類變量。
6. 流類變量.Free:釋放流。
四、Delphi流的常用操作方法
㈠將文件轉換爲文件流
var Source: TFileStream;
begin
Source:=TFileStream.Create(源文件,fmOpenRead or fmShareExclusive);
End;
以上代碼的意義是:將源文件以只讀或者禁止任何方式打開文件的方式打開,並創建成文件流的形式,最後將其賦值給文件流變量Source。
㈡將文件轉換爲內存流
var Source: TMemoryStream;
begin
Source:=TMemoryStream.Create;
Source.LoadFromFile(源文件);
End;
以上代碼的意義是:創建一個內存流變量Source,並將源文件加載到流變量Source中。
㈢將內存流保存成文件
var Target: TMemoryStream;
begin
Target.SaveToFile(‘目標文件’);
end;
注意,文件流一經創建就是以文件的形式保存在磁盤中,因此沒有像內存流一樣有轉換成文件的操作。
㈣將其它類變量轉變爲流變量
var BmS: TMemoryStream;
Bitmap1:TBitmap;
begin
Bitmap1.SaveToStream(BmS);
end;
㈤將兩個流合併
var
Target, Source: TFileStream;
begin
Source:=TFileStream.Create(輔文件, fmOpenRead or fmShareExclusive);
Target:=TFileStream.Create(主文件, fmOpenWrite or fmShareExclusive);
Target.Seek(0, soFromEnd);//將指針移到主文件的末尾
Target.CopyFrom(Source, 0);//注意:兩個流合併使用CopyFrom方法。
Target.Free;
Source.Free;
end;
以上程序實際爲兩個文件合併的操作,即將輔文件添加到主文件的後面,最後變成一個文件。需要注意的是兩個流合併需要先將指針移到主文件末尾,然後再將輔文件添加進來。該方法可用於文件加密、木馬捆綁、病毒傳染等。
㈥將兩個流分離
var
Source: TFileStream;
Target: TMemoryStream;
MyFileSize: integer;
Begin
MyFileSize:=輔文件長度;
Target :=TMemoryStream.Create;
Source:=TFileStream.Create(主文件, fmOpenRead or
fmShareDenyNone);
Source.Seek(-MyFileSize, soFromEnd); //定位到資源位置
//注意:這裏面-sizeof(MyFileSize)的原表達式是0-SizeOf(MyFileSize)。意思將指針移到離末尾MyFileSize個字節處,準備從該處起讀取數據。參數soFromEnd就
是“離末尾”的意思,如果參數是soFromBeginning,那就是“離前面”的意思。
Target.CopyFrom(Source, MyFileSize); //取出資源
Target.SaveToFile(TargetFile); //存放到文件
Target.Free;
Source.Free;
end;
上述程序實現的功能實際是將兩個合併的文件分離開來。該方法還可用於文件的分割、文件加密等。學習時請注意其指針移動的方法