Delphi流的操做

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爲數據的長度字節數,該方法返回值爲實際寫入流中的字節數。

3Seek:此方法實現流中讀取指針的移動。

函數原形爲:

Function Seek(Offset:Longint;Origint:Word):Longint;virtual;abstract;

參數Offset爲偏移字節數,參數Origint指出Offset的實際意義,其可能的取值以下:

soFromBeginning:Offset爲移動後指針距離數據開始的位置。此時Offset必須大於或者等於零。

soFromCurrent:Offset爲移動後指針與當前指針的相對位置。

soFromEnd:Offset爲移動後指針距離數據結束的位置。此時Offset必須小於或者等於零。該方法返回值爲移動後指針的位置。

4Setsize:此方法實現改變數據的大小。函數原形爲:

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時,CopyFromSource參數的當前位置拷貝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;

上述程序實現的功能實際是將兩個合併的文件分離開來。該方法還可用於文件的分割、文件加密等。學習時請注意其指針移動的方法。

相關文章
相關標籤/搜索