一、流的概念

流简单说是建立在面向对象基础上的一种抽象的处理数据的工具,它定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员只需掌握对流进行操作,而不用关心流的另一头数据的真正流向。其实,流就是把整个对象转化为一个一个单字节数据,然后形成数据流,其形同把固体石块打碎成一颗颗细小的沙子一样,最后可以形成流沙。

二、流的主要功能

流的主要功能是对文件与非文件数据相互转换进行操作(即它们之间的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流的更多相关文章

  1. Delphi流的操作 转

    一.流的概念 流简单说是建立在面向对象基础上的一种抽象的处理数据的工具,它定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员只需掌握对流进行操作,而不用关心流的另一头数据的真正流向.其实,流 ...

  2. Delphi流的操作

    一.流的概念 流简单说是建立在面向对象基础上的一种抽象的处理数据的工具,它定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员只需掌握对流进行操作,而不用关心流的另一头数据的真正流向.其实,流 ...

  3. Delphi流的操作_文件合并

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  4. delphi 基础之三 文件流操作

    文件流操作 Delphi操作流文件:什么是流?流,简单来说就是建立在面向对象基础上的一种抽象的处理数据的工具.在流中,定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员是对流进行所有操作的, ...

  5. (转载)delphi文件流

    delphi文件流 [复制链接] 在Delphi中,所有流对象的基类为TStream类,其中定义了所有流的共同属性和方法. TStream类中定义的属性介绍如下: 1.Size: 此属性以字节返回流中 ...

  6. Delphi从内存流中判断图片格式(好多相关文章)

    废话不多说了,利用内存流来判断文件的格式,其实判断文件的前几个字节就可以简单的判断这个文件是什么类型的文件,例如jpg文件 是 FFD8 (从低位到高位就要反过来 D8FF 下面都是一样)BMP文件  ...

  7. delphi的流操作的语法

    Delphi在这两方面都做的相当出色.在Delphi的早期版本Turbo Pascal 中就曾有流(Stream).群(Collection)和资源(Resource)等专门用于对象式数据管理的类.在 ...

  8. 用Delphi从内存流中判断图片格式

    https://blog.csdn.net/my98800/article/details/53536774 废话不多说了,利用内存流来判断文件的格式,其实判断文件的前几个字节就可以简单的判断这个文件 ...

  9. CAD从二制流数据中加载图形(com接口Delphi语言)

    主要用到函数说明: _DMxDrawX::ReadBinStream 从二制流数据中加载图形,详细说明如下: 参数 说明 VARIANT varBinArray 二制流数据,是个byte数组 BSTR ...

随机推荐

  1. 前端学习(八)sass和bootstrap(笔记)

    less sass 和less基本上70%差不多(书写方式不一样) sass功能更多一点 1.定义一个变量 $b:blue; div{width:100px;height:100px; backgro ...

  2. 在Eclipse上安装Spring Tool Suite

    . 不装IDE会没有Spring bean configure file Spring Tool Suite是一个基于Eclipse IDE开发环境中的用于开发Spring应用程序的工具,提供了开箱即 ...

  3. 【BZOJ5093】图的价值

    题面 Description "简单无向图"是指无重边.无自环的无向图(不一定连通). 一个带标号的图的价值定义为每个点度数的k次方的和. 给定n和k,请计算所有n个点的带标号的简 ...

  4. Java类的成员之四:代码块.

    3.2类的成员之四:代码块 ①初始化块(代码块)作用:对Java对象进行初始化 ②程序的执行顺序: ③一个类中初始化块若有修饰符,则只能被static修饰,称为静态代码块(static block ) ...

  5. go new

    go new 尽管没有构造函数,go有一个内置的函数new,可以用来分配一个类型需要的内存.new(X)和&X{}是等效的: goku := new(Saiyan) // 等效 goku := ...

  6. luoguP2148 [SDOI2009]E&D [sg函数][组合游戏]

    题目描述 小E 与小W 进行一项名为“E&D”游戏. 游戏的规则如下: 桌子上有2n 堆石子,编号为1..2n.其中,为了方便起见,我们将第2k-1 堆与第2k 堆 (1 ≤ k ≤ n)视为 ...

  7. 基于mybatis-plus的代码生成

    基于mybatis-plus的代码生成 前言 随着敏捷开发模式的推广,伴着日益增长的需求,日常工作中我们越来越注重效率和便捷性.今天我们就来探讨下如何自动生成代码,准确地说是如何依赖数据库生成我们的e ...

  8. AcWing ST算法(区间求最值)打卡

    一,介绍 ST算法是一个用倍增来求区间最值的算法,倍增是一个与二分类似的思想的一个东西,倍增简而言之也就是区间长度按1,2,4,8..... 我们先用nlog(n)的复杂度打出一个最大值表,后面我们可 ...

  9. WebBug靶场基础篇 — 02

    本篇以第一人称记录这个关卡的第 1-5 关. 由于我记录的过程有点偏向于思考,所以截图截的多 = =!所以文章有点长... 下午一觉醒来,已经 4 点多了,然后开电脑,在虚拟机里,铺了铺靶场,但是毕竟 ...

  10. vim编辑器设置缩进!

    转载自 http://blog.chinaunix.net/uid-27213819-id-3813909.html 1.在自己的home目录下建立.vimrc文件.控制台输入vi ~/.vimrc ...