`

Delphi流的操作

 
阅读更多

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为数据的长度字节数,该方法返回值为实际写入流中的字节数。

3Seek:此方法实现流中读取指针的移动。

函数原形为:

Function Seek(Offset:Longint;Origint:Word):Longint;virtual;abstract;

参数Offset为偏移字节数,参数Origint指出Offset的实际意义,其可能的取值如下:

soFromBeginning:Offset为移动后指针距离数据开始的位置。此时Offset必须大于或者等于零。

soFromCurrent:Offset为移动后指针与当前指针的相对位置。

soFromEnd:Offset为移动后指针距离数据结束的位置。此时Offset必须小于或者等于零。该方法返回值为移动后指针的位置。

4Setsize:此方法实现改变数据的大小。函数原形为:

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时,CopyFromSource参数的当前位置拷贝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 流操作EXCEL

    本文将深入探讨如何使用Delphi进行流操作来处理Excel文件,这在数据导出、报告生成以及数据交换等场景中非常常见。 标题中的"DELPHI 流操作EXCEL"意味着我们将讨论如何在Delphi程序中利用流(Stream)对象来创建或...

    Delphi流操作的语法

    ### Delphi流操作的语法详解 #### 一、Delphi中流的基本概念及函数声明 在Delphi编程中,“流”是一种重要的数据处理方式,它为程序员提供了灵活且高效的手段来处理不同来源的数据,如文件、内存块或网络数据等。...

    Delphi_Stream.rar_Stream XML DELphi_delphi 流操作

    `TStream`是Delphi提供的一个基础类,用于实现流操作,它提供了读写数据的基本方法,能够与各种数据源(如文件、内存、网络等)进行交互。本篇文章将详细介绍`TStream`类及其在处理XML数据时的应用。 首先,我们...

    Delphi流文件操作

    而诸如网络上传输的数据、内存中的存储的数据等也都属于非文件数据,这些数据要转变成文件也需要流操作。 在Delphi中,所有流对象的基类为Tstream类,其中定义了所有流的共同属性和方法。Tstream类中定义了以下几个...

    Delphi_流操作的语法

    ### Delphi 流操作的语法详解 在深入探讨Delphi编程中流的应用之前,让我们首先了解流的概念及其在Delphi中的实现方式。流(Stream)是一种用于处理数据输入和输出的抽象概念,它允许程序员以统一的方式操作不同类型...

    Delphi_流操作的语法.rar

    本文将深入探讨Delphi流操作的语法,并通过实例来解释其使用。 1. **什么是流** 在计算机科学中,流是一种抽象概念,代表数据序列的连续流动。在Delphi中,流可以是文件流、内存流、网络流等,它们都继承自...

    delphi 数据流操作

    在Delphi编程环境中,数据流操作是至关重要的一个部分,特别是在处理文件、网络通信和数据库交互等场景。本文将深入探讨Delphi中的数据流(Stream)概念,以及如何利用它来实现QQ数据传输、数据库操作和文本操作。...

    FFMPEG_delphi_demo.rar_delphi ffmpeg.exe_delphi 流媒体_ffmpge delph

    在 Delphi 开发环境中,我们可以利用 FFmpeg 库来实现 H264 解码功能,这对于开发流媒体应用非常有帮助。本示例是关于如何在 Delphi 中集成 FFmpeg 并创建一个简单的解码演示。 首先,`FFMPEG_delphi_demo.rar` 是...

    Delphi流加密

    以下是对"Delphi流加密"这个主题的详细解释。 首先,我们需要了解什么是流(Stream)。在 Delphi 中,流是一种抽象的概念,它代表了一组可以读取或写入的数据。流可以是文件、内存块、网络连接等。它们提供了统一的...

    delphi中操作word

    在本项目中,我们探讨的是如何使用Delphi来操作Microsoft Word,特别是涉及到在Word文档中插入表格以及对表格的行、列进行操作。 首先,让我们深入了解一下如何在Delphi中与Word交互。这通常通过使用Microsoft ...

    delphi流相互转换

    在Delphi编程环境中,处理数据流是常见的任务,特别是在数据传输、序列化和存储时。本篇文章将深入探讨如何在`MemoryStream`, `TList<String>` 和 `stringstream`(即`TStringStream`)之间进行转换,以实现不同数据...

    delphi针对数据流的操作内含数据库

    在这个特定的上下文中,"Delphi针对数据流的操作内含数据库" 提示我们讨论的重点是Delphi如何处理数据流以及与数据库的交互。 数据流通常指的是数据在系统中的传输过程,这可能涉及到读取、处理和存储。在Delphi中...

    Delphi内存流读写、删除、输入输出实例,将若干个流合并成一个流,可以对其进行读出添加删除操作以及输出为文件或流.zip

    在本文中,我们将深入探讨如何在Delphi编程环境中利用内存流进行读写、删除和输入输出操作。Delphi中的TMemoryStream类是一个非常强大的工具,它允许开发者在内存中存储和处理数据,而无需依赖磁盘文件。我们将通过...

    Delphi 字符串 流的读取

    TStringStream 是 Delphi 的 Indy 库中提供的一个组件,它可以作为内存中的流对象,用来存储和操作字符串。这种流对象可以像处理二进制数据一样处理文本,使得字符串的操作更加灵活。 2. **创建与初始化** 要创建...

    delphi、C++ builder流操作

    这里我们将深入探讨Delphi中的流操作,包括基本概念、常用函数以及实际应用示例。 首先,理解什么是流。流是一种抽象的数据处理模型,它提供了一种面向对象的方式来操作数据。在流模型中,程序员不需要关注数据的...

    Delphi 流数据的压缩与解压

    流数据处理允许程序在不一次性加载全部数据的情况下,逐块读取和操作数据,这对于处理大文件和网络通信特别有用。 Delphi中的流数据处理主要通过TStream类来实现,它是一个抽象类,提供了一套标准的方法来读写数据...

    Delphi中数据流的操作及实例

    总的来说,掌握Delphi中的数据流操作对于开发高效、灵活的程序至关重要。通过熟练运用INSERT和APPEND操作,你可以更好地控制数据的读写,无论是内存中的数据还是磁盘上的文件。同时,利用Delphi提供的丰富流类型,...

    利用Delphi的流对象对多媒体文件进行操作.rar_delphi 多媒体_delphi 流_多媒体

    在这个项目中,"利用Delphi的流对象对多媒体文件进行操作",开发者可能实现了将多媒体数据流化,从而进行高效的操作和管理。 首先,我们需要理解Delphi中的流对象类型,如TMemoryStream、TFileStream、...

Global site tag (gtag.js) - Google Analytics