- 浏览: 133296 次
- 性别:
文章分类
最新评论
一、流的概念
流简单说是建立在面向对象基础上的一种抽象的处理数据的工具,它定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员只需掌握对流进行操作,而不用关心流的另一头数据的真正流向。其实,流就是把整个对象转化为一个一个单字节数据,然后形成数据流,其形同把固体石块打碎成一颗颗细小的沙子一样,最后可以形成流沙。
二、流的主要功能
流的主要功能是对文件与非文件数据相互转换进行操作(即它们之间的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;
上述程序实现的功能实际是将两个合并的文件分离开来。该方法还可用于文件的分割、文件加密等。学习时请注意其指针移动的方法。
发表评论
-
Delphi中的接口和抽象类
2010-12-06 16:30 552接口:Interface Delphi中接口的关键字 ... -
Delphi中票据凭证的精确打印
2011-04-06 15:13 972一、概述 在银行,税务,邮政等行业的实际工作中,经常涉及到在 ... -
Pascal与C的指针
2011-05-26 13:49 983大家都认为,C语言 ... -
Delphi编程的一些资料1
2011-06-16 10:40 705手机 SMS PDU 格式参考手册 1.相关的GSM AT指 ... -
Delphi编程的一些资料2
2011-06-16 10:43 700算法步骤: 一、地址 ... -
Delphi编程的一些资料3
2011-06-16 10:46 766一、一般命令 AT+CGMI ... -
Delphi编程的一些资料4
2011-06-16 10:48 764七、追加服务命令 AT+CCFC 呼叫继续 ... -
Delphi编程的一些资料5
2011-06-16 10:53 756十三、SIM卡工具箱命令 AT+STSF ... -
短信文本模式下的解码方法
2011-06-16 10:57 774接收短信有两种编码格式: 1.中英文混合的为unicode 2 ... -
通过注册表获取当前所有串口号
2011-06-16 15:49 2690usesWindows, Messages, SysUtils ... -
Delphi 分隔GSMModem接收到的短信字符串
2011-06-20 10:37 1067Delphi 分隔GSMModem接收到的短信字符串 ... -
Delphi流的操作
2011-06-22 14:34 788Delphi流的操作 一、流的概念 流简单说是建立在面 ... -
Delphi、PChar和Char数组的比较
2011-06-22 16:14 1237Delphi、PChar和Char数组的 ... -
Delphi 判断数据库表是否存在
2011-06-26 12:54 1030//根据表名和一个数据库连接判断表是否存在 function ... -
Delphi ListView基本用法大全
2011-08-22 17:27 1332Delphi ListView基本用法大全 //增加项或列( ... -
Delphi2010 无效的类别字符串, ProgID: "ADOX.Catalog"问题
2012-07-18 09:56 2048程序中用ADOX创建的Access数据库,一直运行正常,其 ... -
Delphi 禁用TEdit右键菜单及复制粘贴
2012-07-19 11:24 1360Delphi 禁用TEdit右键菜单及复制粘贴简的单方法 ... -
Delphi TStrings取得Ini文件键值对
2012-07-20 07:37 1328Delphi TStrings取得Ini文件键值对的简单 ... -
Delphi 压缩Access数据库
2012-07-21 12:21 1599由于Access数据库在反复使用过程中会自动增大,Del ...
相关推荐
Delphi 深度编程及其项目应用开发Delphi 深度编程及其项目应用开发Delphi 深度编程及其项目应用开发Delphi 深度编程及其项目应用开发Delphi 深度编程及其项目应用开发Delphi 深度编程及其项目应用开发Delphi 深度...
delphi经典编程入门.chm 第一章 Delphi快速入门(一) 第一章 Delphi快速入门(二) 第一章 Delphi快速入门(三) 第一章 Delphi快速入门(四) 第一章 Delphi快速入门(五) 第二章 Delphi面向...
delphi编程 delphi编程 delphi编程 delphi编程 delphi编程
《Delphi编程技巧集》Delphi编程技巧大全
《Delphi 深度编程及其项目应用开发》 作 者: 李存斌 汪兵 编著 丛书名: 万水软件项目应用与实例开发丛书 出版社: 中国水利水电出版社 出 版: 2002-9----------简 介 本书是在总结作者多年Delphi开发经验的基础上...
Delphi编程技术全集 包括:Delphi7中使用Rave报表.chm;Delphi 7应用编程150例.chm;Delphi编程五大妙招.exe;Delphi技巧集C.chm;DELPHI经典编程入门.chm;ExpressQuantumGrid4.5 中文教程 by TT8.exe.
介绍delphi7 应用编程 介绍delphi7 应用编程
Delphi的最新版本Delphi 6扩大了原有的VCL功能、改进了编辑器和编译器、新增了许多网络应用程序开发组件和开发工具,北引进了跨平台开发的类库CLX。总之,Internet的发展给Delphi 6增添了新的活力。本书介绍了使用...
Delphi_深度编程及其项目应用开发,Delphi_深度编程及其项目应用开发
delphi编程宝典delphi编程宝典delphi编程宝典delphi编程宝典delphi编程宝典delphi编程宝典delphi编程宝典delphi编程宝典delphi编程宝典delphi编程宝典delphi编程宝典delphi编程宝典delphi编程宝典delphi编程宝典
DELPHI编程资料包,可以方便朋友们快速的查找编程所需资料,掌握DELPHI编程。
第十一章 Delphi应用程序的应用(一) 第十一章 Delphi应用程序的应用(二) 第十二章 异常处理与程序调试(一) 第十二章 异常处理与程序调试(二) 第十二章 异常处理与程序调试(三) 第十三章 Delphi...
Delphi编程技巧
Delphi7_应用编程150例,由浅入深的解析delphi编程,让你能快速入手
delphi编程实例 视频制作
delphi编程手册 3.0
Delphi编程技巧集锦。一些实用的小技巧等。
用Delphi进行OpenGL编程学习心得 开 发 基 于ORACLE7 数 据 库 的 管 理 信 息 系 统 用Delphi 实 现 自 定 义 颜 色 对 话 框 及 其 构 件 Delphi自定义消息应用一例 自 定 义 快 速 报 表 的 打 印 预 览 ...