Delphi流的操做php
1、流的概念程序員
流簡單說是創建在面向對象基礎上的一種抽象的處理數據的工具,它定義了一些處理數據的基本操做,如讀取數據,寫入數據等,程序員只需掌握對流進行操做,而不用關心流的另外一頭數據的真正流向。其實,流就是把整個對象轉化爲一個一個單字節數據,而後造成數據流,其形同把固體石塊打碎成一顆顆細小的沙子同樣,最後能夠造成流沙。數據庫
2、流的主要功能網絡
流的主要功能是對文件與非文件數據相互轉換進行操做(即它們之間的I/O操做)。如將圖片文件保存到數據庫,那麼數據庫中的圖片數據就變成非文件數據了,它只屬於某記錄某字段的數據。而諸如網絡上傳輸的數據、內存中的存儲的數據等也都屬於非文件數據,這些數據要轉變成文件也須要流操做。函數
3、Delphi中流的基本概念及函數聲明工具
㈠流的屬性學習
在Delphi中,全部流對象的基類爲Tstream類,其中定義了全部流的共同屬性和方法。如下爲Tstream類中定義的屬性:加密
1.Size:此屬性以字節返回流中數據大小。spa
2.Position:此屬性控制流中存取指針的位置。.net
㈡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:釋放流。
4、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;
上述程序實現的功能實際是將兩個合併的文件分離開來。該方法還可用於文件的分割、文件加密等。學習時請注意其指針移動的方法。