加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi中关于流的学习

发布时间:2020-12-15 09:57:27 所属栏目:大数据 来源:网络整理
导读:unit Unit1;interfaceuses Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,zlib;type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Memo2: TMemo; Button2: TButton; Button3: TButton; Button4: TButton
unit Unit1;

interface

uses
  Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,zlib;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
  private
    mStream: TMemoryStream;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
type
  TRec = record
    name: string[8];
    age: word;
  end;
function SplitFile(const FileName:string; Size: Cardinal): Boolean;
var 
     fStream: TFileStream;  {原始文件} 
     toStream: TMemoryStream;{分文件} 
     p,i: Integer;           {p 记录当前指针位置; i 记录这是第几个分的文件}
begin 
     Result := False; 
     Size := Size * 1024;   {把大小的单位转换为字节} 
     fStream := TFileStream.Create(FileName,fmOpenRead); 
     p :=0; 
     i :=0; 
     toStream := TMemoryStream.Create; 
     while p < fStream.Size do
     begin   
          toStream.Clear;       {清空上次数据}   
          fStream.Position := p;{放好指针位置}
          if fStream.Size-p < Size then
             Size := fStream.Size-p;{最后一个时,有多少算多少}
          toStream.CopyFrom(fStream,Size);{复制}   
          toStream.SaveToFile(FileName +'.' + IntToStr(i));       {保存}   
          Inc(i);   
          p := p + Size;
      end; 
      fStream.Free; 
      toStream.Free; 
      Result := True;
end;
//合并文件,参数是其中一个分文件名
function MergeFile(const FileName:string): Boolean;
var 
     ms: TMemoryStream; {读取分文件} 
     fs: TFileStream; {合并后的文件} 
     path:string; 
     i: Integer;
begin 
     path := ChangeFileExt(FileName,'');{去掉序号扩展名} 
     ShowMessage(path); 
     i :=0; 
     ms := TMemoryStream.Create; 
     fs := TFileStream.Create(path,fmCreate); 
     while FileExists(path +'.' + IntToStr(i))do 
     begin   
          ms.LoadFromFile(path +'.' + IntToStr(i));   
          fs.CopyFrom(ms,0);{TFileStream 不需要 SetSize; 但如果用 TMemoryStream 就需要}   
          Inc(i); 
     end; 
     ms.Free; 
     fs.Free;
end;
//  Zlib;//压缩函数
//procedure Zip(var fs: TMemoryStream);
procedure Zip(var fs: TMemoryStream);
var 
     cs: TCompressionStream; 
     ms: TMemoryStream; 
     num: Integer;
begin
     if not(Assigned(fs)and (fs.Size>0))then
         Exit;
     num := fs.Size;   
     ms := TMemoryStream.Create;   
     cs := TCompressionStream.Create(clMax,ms); 
     try   
         fs.SaveToStream(cs);   
         cs.Free;   //ms.Position := 0; 
         fs.Clear;   
         fs.WriteBuffer(num,sizeof(num));   
         fs.CopyFrom(ms,0); 
     finally   
        ms.Free; 
     end;
end;
//解压函数
procedure UnZip(var fs: Tmemorystream);
var 
     ds: TDecompressionStream; 
     ms: TMemoryStream; 
     num: Integer;
begin
     if not(Assigned(fs)and (fs.Size>0))then
        Exit; 
     fs.Position :=0; 
     fs.ReadBuffer(num,sizeof(num));
     ms := TMemoryStream.Create; 
     ds := TDecompressionStream.Create(fs); 
     try   
         ms.SetSize(num);   
         ds.Read(ms.Memory^,num);   //ms.Position := 0;   
         fs.Clear;   
         fs.CopyFrom(ms,0);
     finally   
         ds.Free;   
         ms.Free; 
     end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  pc: PChar;
  buffer: array[0..7] of char;
begin
  pc := mStream.Memory;
//  showmessage(pc[0]);
//  showmessage(pc[6]);
//  showmessage(pc[7]);//回车换行占2个
  // 从流到缓存去
  mStream.Seek(10,soFromBeginning);
  mstream.Read(buffer,sizeof(buffer));
  showmessage(buffer);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  strList: TStringList;
begin
  mStream := TMemoryStream.Create;
  strList := TStringlist.Create;
  strList.Add('aaaaaaaa');
  strList.Add('bbbbbbbb');
  strList.Add('cccccccc');
  strList.Add('dddddddd');
  strList.SaveToFile('Stream.txt');
  strList.Free;
  mStream.LoadFromFile('Stream.txt');
  Memo1.Lines.LoadFromStream(mStream);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  mStream.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  mStream.Position := 4;
  showmessage(inttoStr(mStream.Position));
  showMessage(inttoStr(mStream.Size));
  Memo2.Lines.LoadFromStream(mStream);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  sGetPath,sToPath: string;
  getStream,setStream :TFileStream;
begin
  sGetPath := '证件照.jpg';
  sToPath := '证件照1.jpg';
  if not FileExists(sGetPath) then
  begin
    showmessage('找不到我们要测试的照片:'+ sgetpath);
    exit;
  end;
//TFileStream 打开模式与共享模式:
//分类	参数	说明
//fmCreate 	建立文件,如果存在则打开它。
//fmOpenRead	只读打开
//fmOpenWrite	只写打开
//fmOpenReadWrite	读写打开
//-----------------------
//fmShareCompat	共享模式,兼容 Dos
//fmShareExclusive 	不允许别人以任何方式打开
//fmShareDenyWrite 	允许别人以只写方式打开
//fmShareDenyRead	允许别人以只读方式打开
//fmShareDenyNone	允许别人以任何方式打开
  getStream := TFileStream.Create(sGetPath,fmOpenRead or fmShareExclusive);
  setStream := TFileStream.Create(sTopath,fmCreate);
  setStream.CopyFrom(getStream,getStream.Size);
  getStream.Free;
  setStream.Free;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  //writeComponentResFile('memo1.dat',memo1); {只此一句就可以把当前的 Memo 的状态序列化到文件}
  memo1.Lines.Clear;
  readComponentResFile('memo1.dat',memo1);  {一句话就可以读回,不管是经过了什么操作(甚至是关机)}
end;

procedure TForm1.Button5Click(Sender: TObject);
var
  stream : TStream;
begin
  memo1.Lines.clear;
//  序列化与反序列化
//  stream := TFileStream.Create('m.dat',fmCreate);
//  stream.WriteComponentRes(memo1.ClassName,memo1);
  stream := TFileStream.Create('m.dat',fmOpenRead);
  stream.ReadComponentRes(memo1);
  stream.Free;
end;

procedure TForm1.Button6Click(Sender: TObject);
var
  rec: Trec;
  ms: TMemoryStream;
begin
  ms := TMemoryStream.Create;
//  rec.name := '张三';
//  rec.age := 8;  // byte 8 位, word 16 位;  longword 32 位,相当于 cardinal
//  ms.Write(rec,sizeof(rec));
//  rec.name := '李四';
//  rec.age := 81;  // byte 8 位, word 16 位;  longword 32 位,相当于 cardinal
//  ms.Write(rec,sizeof(rec));
//  rec.name := '裴晓斌';
//  rec.age := 25;  // byte 8 位, word 16 位;  longword 32 位,相当于 cardinal
//  ms.Write(rec,sizeof(rec));
//  ms.SaveToFile('rec.dat');
  // 读取
  ms.LoadFromFile('rec.dat');
  memo1.Clear;
  ms.Position :=0;
  while ms.Position < ms.Size do
  begin
    ms.Read(rec,sizeof(rec));
    memo1.Lines.Add(rec.name + ' ' + inttostr(rec.age));
  end;
  ms.Free;
end;

// 压缩流 与 解压缩流
procedure TForm1.Button7Click(Sender: TObject);
var
  cs: TCompressionStream;
  fs,ms: TMemoryStream;
  num: integer;
begin
  fs := TMemoryStream.Create;
  fs.LoadFromFile('证件照.jpg');
  num := fs.Size;
  ms := TmemoryStream.Create;
  ms.Write(num,sizeof(num));
  cs := TCompressionStream.Create(clMax,ms);
  fs.SaveToStream(cs);
  cs.Free;
  ms.SaveToFile('1.zipx');
  ms.Free;
  fs.Free;
end;
// 文件的压缩与解压
procedure TForm1.Button8Click(Sender: TObject);
var 
  ds: TDecompressionStream;{解压流}
  fs,ms: TMemoryStream;   {fs 是准备要解压的流; ms 是接受解压数据的流}
  num: Integer;           {接受文件压缩前的大小}
begin {第一步: 准要解压的文件}
  fs := TMemoryStream.Create;
  fs.LoadFromFile('1.zipx');{必须是上一个压缩方法生成的文件}
  {第二步: 读出文件压缩前的大小}
  fs.Position :=0;
  fs.ReadBuffer(num,SizeOf(num)); {第三步: 准备好要接收的流,并设置需要的大小}
  ms := TMemoryStream.Create;
  ms.SetSize(num); {第四步: 解压}
  ds := TDecompressionStream.Create(fs);{参数是要解压的流}
  {第五步: 把解压后的数据读出存放到已准备好接收的流}
  ds.Read(ms.Memory^,num); {第六步: 保存}
  ms.SaveToFile('2.jpg');
  ds.Free;
  ms.Free;
  fs.Free;
end;

end.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读