CBUILDER中相关流对象的讨论

爱没心没肺是福

爱没心没肺是福

2016-02-19 16:33

有了下面这个CBUILDER中相关流对象的讨论教程,不懂CBUILDER中相关流对象的讨论的也能装懂了,赶紧get起来装逼一下吧!

  第一章 概述

  在CBUILDER中,存在以下几种流对象:

  TFileStream

  TMemoryStream

  TStringStream

  TWinSocketStream

  TBlobStream

  TOleStream

  TClientBlobStream

  TResourceStream

  下面是以上各类的继承关系

  TObject

  |

  TStream

  |

  +---------------------------+---------------------------+--------------------+-------------------+------------+

  |         |         |       |      |    |

  THandleStream TCustomMemoryStream TWinsocketStream TBlobStream TOleStream TStringStream

  |         |

  TFileStream TMemoryStream

  |

  +-------------------------------------------+

  |              |

  TClientBlobStream     TResourceStream

  第二章 流对象的属性及方法简介

  关于各属性和方法的详细语法请见CBUILDER的帮助

  一. TStream介绍

  属性

  Position:当前位置指针

  Size:流的大小,单位为字节

  方法

  CopyFrom:从一个流往另一个流拷贝数据

  Read:从流中读取一定字节的数据到缓冲区,返回读取的字节数

  ReadBuffer:从流中读取一定字节的数据到缓冲区,如不正确则异常

  ReadComponent:从流中取出一个组件

  ReadComponentRes:以Windows的资源文件格式从流中读取一组件

  Seek:定位流的当前位置指针

  SetSize:设置流的大小。

  Write:从缓冲区中将一定字节的数据写入到流中,返回写入的字节数

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  WriteBuffer:从缓冲区中将一定字节的数据写入到流中,失败则异常

  WriteComponent:将一组件写入到流中

  WriteComponentRes:将一组件以Windows资源文件的格式写入到流中

  注意:不能直接建立一个TStream类型的流对象

  二. THandleStream介绍

  属性

  Handle:流对象要读写的通迅资源的句柄

  Size:句柄所标识的资源的大小,单位为字节

  方法

  Read:从流中读数据到缓冲区中

  Seek:设置流的当前位置

  SetSize:设置流的大小,不成功则返回一个异常

  THandleStream:通过一个打开的句柄建立一个句柄流对象

  Write:将数据从缓冲区中写入到流

  可以使用THandleStream流对象来存取如文件、套接字、命名管道、邮槽等打开了句柄的通迅资源。下面是一个使用句柄流对象进行文件操作的片段代码:

  

//////////////////////////////////////////////////////////////////////////////////////////////
////将c:config.sys文件中的内容读入到一个文本框中
int fileHandle;
THandleStream *fileStream;
fileHandle = FileOpen(c:\config.sys,fmOpenRead);
if(fileHandle == -1) return ; //打开文件出错
fileStream = new THandleStream(fileHandle);
char buffer[10001];
unsigned long bufferSize;
do
{
  bufferSize = fileStream-Read(buffer, 10000);
  if (bufferSize 0 )
  {
    buffer[bufferSize] = 0;
    Memo1-Text += buffer;
  }
}while( bufferSize == 10000 );
delete fileStream;
FileClose(fileHandle); //请注意一定要先注销流对象才能关闭句柄

  三. TCustomMemoryStream介绍

  属性

  Memory:指向内存流对象的实际内存的指针,可用该指针直接访问内存流的内存

  方法

  Read:从流中读数据到缓冲区中

  SaveToFile:将内存流中的数据保存到文件中

  SaveToStream:将内存流中的数据保存到其它流对象中

  Seek:设置流对象的当前位置

  SetPointer:设置与内存流对象相关联的内存池

  注意:该类为纯虚类,不能直接建立其对象。应使用TMemoryStream或是TResourceStream。

  四. TWinSocketStream介绍

  属性

  TimeOut:设置在读或写Socket时的超时值,单位:毫秒

  方法

  Read:从Socket中读取指定字节的数据到缓冲区中,返回实际读取的字节数

  Seek:没有意义

  TWinSocketStream:根据指定的Socket句柄和超时时间建立一个Socket流对象

  WaitForData:确认是否可以通过Socket连接来发送或接收数据了。

  Write:通过Socket连接发送缓冲区中指定字节的数据

  TWinSocketStream流对象用来在阻塞方式的Socket连接中发送和接收数据,从而避免一般情况下的挂起现象。下面是一个用TWinSocketStream进行收发数据的代码片段:

  

/////////////////////////////////////////////////////////////////////////////////////////////////////
//在一单独的线程中通过阻塞式Socket连接发送数据
void __fastcall TMyClientThread::Execute()
{
TWinSocketStream *pStream = new TWinSocketStream(ClientSocket1-Socket, 60000);
try
   {
  while (!Terminated && ClientSocket1-Active)
      {
       try
       {
          char buffer[10];
          GetNextRequest(buffer); // GetNextRequest must be a thread-safe method
// write the request to the server
    pStream-Write(buffer, strlen(buffer) + 1);
          // continue the communication (eg read a response from the server)
    ...
}
catch (Exception &E)
{
    if (!E.ClassNameIs("EAbort"))
    //you must write HandleThreadException
          Synchronize(HandleThreadException());
       }
}
}
__finally
   {
      delete pStream;
   }
}

  五. TBlobStream介绍

  方法

  Read:读取数据到缓冲区中

  Seek:定位流的当前位置

  TBlobStream:根据一个TBlobField字段建立一个流对象

  Truncate:从当前位置截短流对象

  Write:将缓冲区中的数据写入到流对象中

  TBlobStream流对象只用于对TblobField进行操作,注意,当改变了数据集对象的当前记录时,要重新建立TBlobStream对象并在使用完后将之删除。

  

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//读取Blob字段的数据
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int MemSize;
char *Buffer;
TBlobStream *Stream;
if (!Query1-Eof)
Query1-Next();
Stream = new TBlobStream((TBlobField *)Query1-FieldByName("Notes"), bmRead);
   try
   {
      MemSize = Stream-Size + 1; // add one for null terminator
      Buffer = new char[MemSize]; // Allocate the memory.
      try
      {
       Stream-Read(Buffer, MemSize); //Read Notes field into buffer.
       Memo1-SetTextBuf(Buffer); // Display the buffer's contents.
      }
      catch (...)
      {
        delete Buffer;
       throw;
      }
delete Buffer;
}
   catch (...)
   {
      delete Stream;
      throw;
   }
   delete Stream;
}

  六. TOleStream介绍

  方法

  TOLEStream:通过一个流界面建立Ole流对象

  Read:从流对象中读数据到缓冲区中

  Seek:定位流的当前位置

  Write:从缓冲区中将数据写入到流对象中

  七. TStringStream介绍

  属性

  DataString:流对象的实际存储字符串

  Size:流对象大小

  方法

  Read:从流对象中读数据到缓冲区中

  ReadString:以字符串形式返回流中指定数据

  Seek:定位流的当前位置

  TStringStream:根据一个字符串建立字符串流对象

  Write:从缓冲区中将数据写入到流对象中

  WriteString:将字符串中数据写入到流中

  八. TFileStream介绍

  方法

  TFileStream:根据文件名建立或打开一个文件,并建立相应的文件流对象

  例:TFileStream *fsBootINI = new TFileStream(c:\boot.ini,fmOpenRead);

  九. TMemoryStream介绍

  方法

  Clear:清除流对象中所有数据

  LoadFromFile:从文件中读入数据到流对象中

  LoadFromStream:从其它流中读入数据

  SetSize:设置流对象的大小

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  Write:从缓冲区中写数据到内存流中

  十. TClientBlobStream介绍

  方法

  TClientBlobStream:根据TblobField对象建立一个流对象

  Truncate:截短流

  Write:将缓冲区中数据写入到流中

  该流对象用来操作TClientDataSet数据集中的BLOB类型的字段

  十一. TResourceStream介绍

  方法

  TResourceStream:根据EXE文件名柄或DLL文件句柄和资源描述生成流对象

  Write:不支持写操作,产生异常

  十二. 与流对象相关的对象介绍

  TFilter

  +--------------------------+

  |         |

  TReader    TWriter

  以上对象用于将组件写入到流对象中或是从流对象生成组件

  流对象中的方法ReadComponent 和WriteComponent在实现时就是使用TReader和TWriter来实际操作的。

  十三. 与流对象相关的函数

  

extern PACKAGE void __fastcall ObjectTextToBinary(TStream* Input, TStream* Output);
extern PACKAGE void __fastcall ObjectBinaryToText(TStream* Input, TStream* Output);
extern PACKAGE void __fastcall ObjectTextToResource(TStream* Input, TStream* Output);
extern PACKAGE void __fastcall ObjectResourceToText(TStream* Input, TStream* Output);

  以上函数都是针对存储对象的流而言的,在流之间转换流中所存储对象的描述方式。

  第三章 流对象的应用领域

  一. 使用统一的流的概念来操作各种不同类型的资源。

  二. 通过流将资源保存到不同的介质上,如将组件保存到文件中,将ICON资源调入内存等。

  三. 简化一些对象的操作,如TBlobStream和TClientBlobStream

  四. 实现一些原来不好实现的功能,如TWinSocketStream实现超时操作

展开更多 50%)
分享

猜你喜欢

CBUILDER中相关流对象的讨论

编程语言 网络编程
CBUILDER中相关流对象的讨论

JavaScript中Array 对象相关的几个方法

Web开发
JavaScript中Array 对象相关的几个方法

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

《部落战争》中飞龙流的打法相关解析

手机游戏 IOS
《部落战争》中飞龙流的打法相关解析

Javascript中的布尔讨论

Web开发
Javascript中的布尔讨论

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

VC vs CBuilder

编程语言 网络编程
VC vs CBuilder

VB6中ADO流对象实现对二进制大型对象的读取方法

电脑网络
VB6中ADO流对象实现对二进制大型对象的读取方法

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

打通南北 让网页游戏也能痛快加速

打通南北 让网页游戏也能痛快加速

UED体验:网页中胡乱标红

UED体验:网页中胡乱标红
下拉加载更多内容 ↓