首页 / DELPHI / Delphi流的操作
Delphi流的操作
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Delphi流的操作,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4339字,纯文字阅读大概需要7分钟。
内容图文
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 ;
上述程序实现的功能实际是将两个合并的文件分离开来。该方法还可用于文件的分割、文件加密等。学习时请注意其指针移动的方法。
原文:http://my.oschina.net/u/582827/blog/351964
内容总结
以上是互联网集市为您收集整理的Delphi流的操作全部内容,希望文章能够帮你解决Delphi流的操作所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。