function THandleStreamWrite(const Buffer; Count: Longint) Longint;
begin
Result := FileWrite(FHandle Buffer Count)
if Result = then Result := ;
end;
Seek方法調用FileSeek函數實現文件指針的移動其實現如下
function THandleStreamSeek(Offset: Longint; Origin: Word) Longint;
begin
Result := FileSeek(FHandle Offset Origin)
end;
TFileStream對象
TFileStream對象是在磁盤文件上存儲數據的Stream對象TFileStream是從THandleStream繼承下來的它和THandleStream一樣都是實現文件的存取操作不同之處在於THandleStream用句柄訪問文件而TFileStream用文件名訪問文件實際上TFileStream是THandleStream上的一層包裝其內核是THandleStream的屬性和方法
TFileStream中沒有增加新的屬性和方法它只是覆蓋了的構造方法Create和析構方法Destory在Create方法中帶兩個參數FileName和ModeFileName描述要創建或打開的文件名而Mode描述文件模式如fmCreatefmOpenRead和fmOpenWrite等Create方法首先使用FileCreate或FileOpen函數創建或打開名為FileName的文件再將得到的文件句柄賦給FHandleTFileStream的文件讀寫操作都是由從THandleStream繼承的Read
var
Stream: TStream;
begin
Stream := TFileStreamCreate(FileName fmCreate)
try
SaveToStream(Stream)
finally
StreamFree;
end;
end;
在Delphi 的許多對象的SaveToStream 和SaveToFileLoadFromStream和LoadFromFile方法的實現都有類似的嵌套結構
TMemoryStream對象
TMemoryStream對象是一個管理動態內存中的數據的Stream對象它是從TCustomMemoryStream中繼承下來的除了從TCustomMemoryStream中繼承的屬性和方法外它還增加和覆蓋了一些用於從磁盤文件和其它注台讀數據的方法它還提供了寫入消除內存內容的動態內存管理方法下面介紹它的這些屬性和方法
TMemoryStream的屬性和方法
Capacity屬性
聲明
property Copacity: Longint;
Capacity屬性決定了分配給內存流的內存池的大小這與Size屬性有些不同Size屬性是描述流中數據的大小在程序中可以將Capacity 的值設置的比數據所需最大內存大一些這樣可以避免頻繁地重新分配
Realloc方法
聲明
function Realloc(var NewCapacity: Longint)
Pointer; virtual;
Realloc方法以K為單位分配動態內存內存的大小由NewCapacity指定函數返回指向所分配內存的指針
SetSize方法
SetSize方法消除內存流中包含的數據並將內存流中內存池的大小設為Size字節如果Size為零是SetSize方法將釋放已有的內存池並將Memory屬性置為nil;否則SetSize方法將內存池大小調整為Size
Clear方法
聲明
procedure Clear;
Clear方法釋放內存中的內存池並將Memory屬性置為nil在調用Clear方法後Size和Position屬性都為
LoadFromStream方法
聲明
procedure LoadFromStream(Stream: TStream)
LoadFromStream方法將Stream指定的流中的全部內容復制到MemoryStream中復制過程將取代已有內容使MemoryStream成為Stream的一份拷貝
LoadFromFile方法
聲明
procedure LoadFromFile(count FileName: String)
LoadFromFile方法將FileName指定文件的所有內容復制到MemoryStream中並取代已有內容調用LoadFromFile方法後MemoryStream將成為文件內容在內存中的完整拷貝
TMemoryStream對象的實現原理
TMemoryStream從TCustomMemoryStream對象直接繼承因此可以享用TCustomMemoryStream的屬性和方法前面講過TCustomMemoryStream是用於內存中數據操作的抽象對象它為MemoryStream對象的實現提供了框架框架中的內容還要由具體MemoryStream對象去填充TMemoryStream對象就是按動態內存管理的需要填充框架中的具體內容下面介紹TMemoryStream對象的實現
TMemoryStream屬性的實現
TMemoryStream在其protected部分增加了一個Capacity屬性該屬性決定了MemoryStream所占動態內存的大小TMemoryStream首先在private部分聲明了FCapacity變量作為存儲Capacity屬性值的數據域然後在protected部分聲明了該屬性在屬性聲明的讀控制部分簡單讀取FCapacity的值在寫控制處調用了方法SetCapacity該方法除了給FCapacity賦值外還執行了修改Capacity屬性所必需操作如狀態改變等
下面是屬性的實現
TMemoryStream = class(TCustomMemoryStream)
private
FCapacity: Longint;
procedure SetCapacity(NewCapacity: Longint)
protected
…
property Capacity: Longint read FCapacity write SetCapacity;
public
…
end;
寫控制方法SetCapacity的實現是這樣的
procedure TMemoryStreamSetCapacity(NewCapacity: Longint)
begin
SetPointer(Realloc(NewCapacity) FSize)
FCapacity := NewCapacity;
end;
在SetCapacity 方法先是調用Realloc重新分配內存然後用NewCapacity的值給FCapacity賦值Realloc方法進行某些對象狀態的改變
TMemoryStream對象方法的實現
⑴ Realloc方法
Realloc方法是TMemoryStream動態內存分配的核心它的SetSizeSetCapacity等方法最終都是調用Realloc進行內存的分配和初始化工作的它的實現如下
const
MemoryDelta = $;
function TMemoryStreamRealloc(var NewCapacity: Longint) Pointer;
begin
if NewCapacity > then
NewCapacity := (NewCapacity + (MemoryDelta )) and not (MemoryDelta )
Result := Memory;
if NewCapacity <> FCapacity then
begin
if NewCapacity = then
begin
GlobalFreePtr(Memory)
Result := nil;
end else
begin
if Capacity = then
Result := GlobalAllocPtr(HeapAllocFlags NewCapacity)
else
Result := GlobalReallocPtr(Memory NewCapacity HeapAllocFlags)
if Result = nil then raise EStreamErrorCreateRes(SMemoryStreamError)
end;
end;
end;
Realloc方法是以K為單位分配動態內存的方法中的第一句if語句就是執行該操作如果傳入的NewCapacity參數值為則釋放流中的內存Realloc方法用GLobal FreePtr函數釋放內存用GlobalAllocPtr分配內存用GlobalReallocPtr進行內存的重分配如果原來的Capacity屬性值為則調用Globa|AllocPtr否則調用GlobalReallocPtr最後如果Result為nil則觸發內存流錯的異常事件否則返回指向分配的內存的指針
[] [] [] [] []
From:http://tw.wingwit.com/Article/program/Delphi/201311/25107.html