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为数据的长度字节数,该方法返回值为实际写入流中的字节数。
、Seek:此方法实现流中读取指针的移动。
函数原形为:
Function Seek(Offset:Longint;Origint:Word):Longint;virtual;abstract;
参数Offset为偏移字节数,参数Origint指出Offset的实际意义,其可能的取值如下:
soFromBeginning:Offset为移动后指针距离数据开始的位置。此时Offset必须大于或者等于零。
soFromCurrent:Offset为移动后指针与当前指针的相对位置。
soFromEnd:Offset为移动后指针距离数据结束的位置。此时Offset必须小于或者等于零。该方法返回值为移动后指针的位置。
、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;
时,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流的操作的更多相关文章
- Delphi流的操作 转
一.流的概念 流简单说是建立在面向对象基础上的一种抽象的处理数据的工具,它定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员只需掌握对流进行操作,而不用关心流的另一头数据的真正流向.其实,流 ...
- Delphi流的操作_文件合并
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- Delphi流
一.流的概念 流简单说是建立在面向对象基础上的一种抽象的处理数据的工具,它定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员只需掌握对流进行操作,而不用关心流的另一头数据的真正流向.其实 ...
- IO流(四)__流的操作规律总结
流的操作规律: 1.明确源和目的 源:InputStream Reader 目的:OutputStream Writer 2.明确数据是否是纯文本数据 源:是纯文本:Reader 否:InputStr ...
- C# IO流的操作
C# IO流的操作非常重要,我们读写文件都会使用到这个技术,这里先演示一个文件内容复制的例子,简要说明C#中的IO操作. namespace ConsoleApplication1 { class P ...
- Java---IO加强(3)-IO流的操作规律
一般写关于操作文件的读取的几个通用步骤!!! 1.明确源和目的. 源:InputStream Reader 一定是被读取的. 目的:OutputStream Writer 一定是被写入的. 2.处理的 ...
- IO流的操作规律
输入流和输出流相对于内存设备而言. 将外设中的数据读取到内存中:输入将内存的数写入到外设中:输出. 字符流的由来:其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表.获取对应的文字.在 ...
- Java第三阶段学习(五、流的操作规律、Properties流、序列化流与反序列化流、打印流、commons-IO jar包)
一.流的操作规律 四个明确: 明确一:明确要操作的数据是数据源还是数据目的地 源:InputStream Reader 目的地:OutputStream Writer 先根据需求明确是要读还是写 ...
- C# IO流的操作(一)
C# IO流的操作非常重要,我们读写文件都会使用到这个技术,这里先演示一个文件内容复制的例子,简要说明C#中的IO操作. namespace ConsoleApplication1 { class P ...
随机推荐
- css预处理器
Sass.LESS是什么?大家为什么要使用他们? 他们是CSS预处理器.他是CSS上的一种抽象层.他们是一种特殊的语法/语言编译成CSS. Less是一种动态样式语言. 将CSS赋予了动态语言的特 ...
- 【记录】haphost免费vps初始配置
1.配置德国epel源 yum install yum-priorities rpm -Uvh http://ftp-stud.hs-esslingen.de/pub/epel/6/i386/epel ...
- Android Fragment 真正的完全解析(上)--转
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37970961 自从Fragment出现,曾经有段时间,感觉大家谈什么都能跟Fra ...
- 解决BT5不能使用putty连接问题
root@bt:~# cd /etc/sshroot@bt:/etc/ssh# sshd-generate Generating public/private rsa1 key pair.Your i ...
- openwrt串口的使用
从 RT5350 的芯片手册上可以得知, RT5350 一共有两个串口, 分别为 UART Lite. UART Full, UART Lite 就是我们惯称为的串口 1,作为系统调试串口,通过这个串 ...
- python之lambda、filter、map、reduce的用法说明
python中有一些非常有趣的函数,面试的时候可能会遇到.今天也来总结一下,不过该类的网上资料也相当多,也没多少干货,只是习惯性将一些容易遗忘的功能进行整理. lambda 为关键字.filter,m ...
- POJ 3648 Wedding
2-SAT,直接选择新娘一侧的比较难做,所以处理的时候选择新郎一侧的,最后反着输出就可以. A和B通奸的话,就建边 A->B'以及B->A’,表示 A在新郎一侧的话,B一定不在:B在新郎一 ...
- 多个inline元素、block元素、inline-block元素在父容器中的换行情况
1.首先看inine元素的换行情况 <style> *{padding:0;margin:0} div.wrap{width:200px;height:200px;border:1px s ...
- 在Ubuntu 14.04 64bit上安装StarUML 2.5版本
1,在“http://staruml.io/”下载: 2,sudo dpkg -i StarUML-v2.5.0-64-bit.deb安装. 3,注册 .在help中输入.name:maxiongyi ...
- Linux在shell中df半天没反应
问题描述: df -hT 一直没反应,只能Ctrl+c中断此操作! 解决方法: 多是mount挂载远程服务,而远程服务已关闭,出于一直mount状态,df -hT是查看本地挂载和远程挂载! df ...