zoukankan      html  css  js  c++  java
  • Delphi Tstream 流

    Delphi Tstream

    1、概念

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

    2、功能

    流的主要功能是对文件与非文件数据相互转换进行操作(即它们之间的I/O操作)。如将图片文件保存到数据库,那么数据库中的图片数据就变成非文件数据了,它只属于某记录某字段的数据。而诸如网络上传输的数据、内存中的存储的数据等也都属于非文件数据,这些数据要转变成文件也需要流操作。

    3、基本概念及函数声明

    3.1 属性

    在Delphi中,所有流对象的基类为Tstream类,其中定义了所有流的共同属性和方法。以下为Tstream类中定义的属性:

      • 1.Size:此属性以字节返回流中数据大小。
      • 2.Position:此属性控制流中存取指针的位置。

    3.2 虚方法:

      • 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:此方法实现改变数据的大小。

    3.3 静态方法:

    • 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的所有数据;

    3.4 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(资源流)
        • 资源流主要应用于对资源文件的操作。

    3.5 与流操作的一些相关函数和方法

      • 1.sizeof(变量:Integer):获得变量所占空间的大小。
      • 2.流类变量.SaveToFile(目标文件名):将流转变为文件保存。
      • 3.其它类变量.SaveToStream(流类变量):将类变量内容转变为流。
      • 4. 其它类变量.LoadFromFile(目标文件名):将文件加载到其它类变量。
      • 5. 其它类变量.LoadFromStream(流类变量):将流类变量加载到其它类变量。
      • 6. 流类变量.Free:释放流。

    4、Delphi流的常用操作方法

    4.1 将文件转换为文件流

    //将源文件以只读或者禁止任何方式打开文件的方式打开,并创建成文件流的形式,最后将其赋值给文件流变量Source。

    var Source: TFileStream;
    begin
        Source:=TFileStream.Create(源文件,fmOpenRead or fmShareExclusive);
    End;

    4.2 将文件转换为内存流

    // 创建一个内存流变量Source,并将源文件加载到流变量Source中。

    var Source: TMemoryStream;
    begin
      Source:=TMemoryStream.Create;
      Source.LoadFromFile(源文件);
    End;

    4.3 将内存流保存成文件

    var Target: TMemoryStream;
    begin
      Target.SaveToFile(‘目标文件’);
    end;

    注意,文件流一经创建就是以文件的形式保存在磁盘中,因此没有像内存流一样有转换成文件的操作。

    4.4 将其它类(例如:图片)变量转变为流变量

    var BmS: TMemoryStream;
    Bitmap1:TBitmap;
    begin
      Bitmap1.SaveToStream(BmS);
    end;

    4.5 将两个流合并

    //将两个文件合并,将辅文件添加到主文件的后面,最后变成一个文件。需要注意的是两个流合并需要先将指针移到主文件末尾,然后再将辅文件添加进来。该方法可用于文件加密、木马捆绑、病毒传染等。

    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;

    4.6 将两个流分离

    // 将两个合并的文件分离开来。该方法还可用于文件的分割、文件加密等。注意指针移动的方法。 

    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;
    

     

      

    创建时间:2015.05.02  更新时间:2020.05.28

  • 相关阅读:
    最全的 Twitter Bootstrap 开发资源清单
    jQuery布局插件UI Layout简介及使用方法
    SQLcode错误代码汇总和sqlstate=37000的解决方案
    JQUERY插件学习之jQuery UI
    如何判断/检查一个集合(List<string>)中是否有重复的元素
    反射原理及简介
    C# 获取文件夹下的所有文件的文件名
    委托编程指南
    模块封装与程序集
    Redis Lock
  • 原文地址:https://www.cnblogs.com/guorongtao/p/4471591.html
Copyright © 2011-2022 走看看