Delphi支持流,流包括文件、字符串、内存、二进制块、套接字、嵌入式对象等数据源。
Delphi定义TStream类作为所有流类的父类,TStream类有多个子类,每个子类分别处理特定的一种流
。
TStream类是所有流类的父类,其中定义了所有流的共同属性和方法。TStream是抽象类,不能创建该类的实例。TStream类定义在Classes单元中。
对流的读/写操作,每次所能读出/写入的字节数取决于流对象自身的大小,而读出/写入的数据与流对象中当前数据位置有关。
因此,TStream类定义了两个属性Size与Position,Size属性指定流对象的大小,Position属性为在流中进行读/写操作指定当前位置。
作为所有实际使用的所有流类的共同父类,
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);
TStream类是抽象类,提供流操作的共同属性和方法,而没有提供对数据保存的直接支持。
TStream类的子类表示特定的流类,每个子类分别处理一种流。
实际使用时,根据数据的性质,创建TStream类的子类对象。例如,使用TFileStream类进行文件操作,使用TMemoryStream类处理内存中的流。
从TStream类继承的子类必须覆盖Read、Write和Seek等虚方法,实现数据流的具体操作。TStream类的子类说明如下:
(1)TFileStream文件流,用于磁盘文件的读写操作。
(2)TStringStream字符串流,提供类似文件操作方式从长字符串中读写信息。
(3)TMemoryStream内存流,用于动态内存中的数据流的读写操作。
(4)TBlobStream块操作流,提供blob类型的数据流的读写操作。
(5)TwinSocketStream,用于以Socket方式连接的数据流的读写操作。
(6)TOleStream,为嵌入式对象提供数据流的读写操作。
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的同名方法,实现文件的读、写、复制等操作。操作结束后,必须释放文件对象,以释放资源和数据缓冲区。
许多类提供从流中读/写数据的LoadFromStream( )和SaveToStream( )方法,声明如下:
procedure LoadFromStream(Stream:TStream);
procedure SaveToStream(Stream:TStream);
其中,Stream可以为TStream子类的任何对象。
拥有这两个读写流方法的类有TStrings类、TGraphic类及其子类TBitmap、TIcon类、TPicture类和TMemoryStream类