轉(zhuǎn)自網(wǎng)絡(luò),流的概念主要在cbuilder 和delphi編程環(huán)境下的處理,使用流有以下方面
- 1. 使用統(tǒng)一的流的概念來操作各種不同類型的資源。
2. 通過流將資源保存到不同的介質(zhì)上,如將組件保存到文件中,將ICON資源調(diào)入內(nèi)存等。
3. 簡(jiǎn)化一些對(duì)象的操作,如TBlobStream和TClientBlobStream
4.
實(shí)現(xiàn)一些原來不好實(shí)現(xiàn)的功能,如TWinSocketStream實(shí)現(xiàn)超時(shí)操作
1.概述cbuilder流
在CBUILDER中,存在以下幾種流對(duì)象:
TFileStream
TMemoryStream
TStringStream
TWinSocketStream
TBlobStream
TOleStream
TClientBlobStream
TResourceStream
下面是以上各類的繼承關(guān)系
TObject
|
TStream
|
+---------------------------+---------------------------+--------------------+-------------------+------------+
|
|
|
|
| |
THandleStream
TCustomMemoryStream TWinsocketStream TBlobStream TOleStream TStringStream
|
|
TFileStream TMemoryStream
|
+-----------------------------+
|
|
TClientBlobStream
TResourceStream
2 流對(duì)象的屬性及方法簡(jiǎn)介
關(guān)于各屬性和方法的詳細(xì)語法請(qǐng)見CBUILDER的幫助
一. TStream介紹
屬性
Position:當(dāng)前位置指針
Size:流的大小,單位為字節(jié)
方法
CopyFrom:
從一個(gè)流往另一個(gè)流拷貝數(shù)據(jù)
Read: 從流中讀取一定字節(jié)的數(shù)據(jù)到緩沖區(qū),返回讀取的字節(jié)數(shù)
ReadBuffer:
從流中讀取一定字節(jié)的數(shù)據(jù)到緩沖區(qū),如不正確則異常
ReadComponent:從流中取出一個(gè)組件
ReadComponentRes:以Windows的資源文件格式從流中讀取一組件
Seek: 定位流的當(dāng)前位置指針
SetSize:
設(shè)置流的大小。
Write: 從緩沖區(qū)中將一定字節(jié)的數(shù)據(jù)寫入到流中,返回寫入的字節(jié)數(shù)
WriteBuffer:
從緩沖區(qū)中將一定字節(jié)的數(shù)據(jù)寫入到流中,失敗則異常
WriteComponent:將一組件寫入到流中
WriteComponentRes:將一組件以Windows資源文件的格式寫入到流中
二. THandleStream介紹
屬性
Handle:流對(duì)象要讀寫的通迅資源的句柄
Size:句柄所標(biāo)識(shí)的資源的大小,單位為字節(jié)
方法
Read:從流中讀數(shù)據(jù)到緩沖區(qū)中
Seek:設(shè)置流的當(dāng)前位置
SetSize:設(shè)置流的大小,不成功則返回一個(gè)異常
THandleStream:通過一個(gè)打開的句柄建立一個(gè)句柄流對(duì)象
Write:將數(shù)據(jù)從緩沖區(qū)中寫入到流
可以使用THandleStream流對(duì)象來存取如文件、套接字、命名管道、郵槽等打開了句柄的通迅資源。
采用句柄流對(duì)象進(jìn)行文件操作的片段代碼:
//////////////////////////////////////////////////////////////////////////////////////////////
//將c:config.sys文件中的內(nèi)容讀入到一個(gè)文本框中
int fileHandle;
THandleStream
*fileStream;
fileHandle = FileOpen(“c:\config.sys”,fmOpenRead);
if(fileHandle == -1)
return ; //打開文件出錯(cuò)
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);
//請(qǐng)注意一定要先注銷流對(duì)象才能關(guān)閉句柄
三. TCustomMemoryStream介紹
屬性
Memory:指向內(nèi)存流對(duì)象的實(shí)際內(nèi)存的指針,可用該指針直接訪問內(nèi)存流的內(nèi)存
方法
Read:從流中讀數(shù)據(jù)到緩沖區(qū)中
SaveToFile:將內(nèi)存流中的數(shù)據(jù)保存到文件中
SaveToStream:將內(nèi)存流中的數(shù)據(jù)保存到其它流對(duì)象中
Seek:設(shè)置流對(duì)象的當(dāng)前位置
SetPointer:設(shè)置與內(nèi)存流對(duì)象相關(guān)聯(lián)的內(nèi)存池
該類為純虛類,不能直接建立其對(duì)象。
應(yīng)使用TMemoryStream或是TResourceStream。
四. TWinSocketStream介紹
屬性
TimeOut:設(shè)置在讀或?qū)慡ocket時(shí)的超時(shí)值,單位:毫秒
方法
Read:從Socket中讀取指定字節(jié)的數(shù)據(jù)到緩沖區(qū)中,返回實(shí)際讀取的字節(jié)數(shù)
Seek:沒有意義
TWinSocketStream:根據(jù)指定的Socket句柄和超時(shí)時(shí)間建立一個(gè)Socket流對(duì)象
WaitForData:確認(rèn)是否可以通過Socket連接來發(fā)送或接收數(shù)據(jù)了。
Write:通過Socket連接發(fā)送緩沖區(qū)中指定字節(jié)的數(shù)據(jù)
TWinSocketStream流對(duì)象用來在阻塞方式的Socket連接中發(fā)送和接收數(shù)據(jù),
從而避免一般情況下的掛起現(xiàn)象。
下列是一個(gè)用TWinSocketStream進(jìn)行收發(fā)數(shù)據(jù)的代碼片段:
/////////////////////////////////////////////////////////////////////////////////////////////////////
//在一單獨(dú)的線程中通過阻塞式Socket連接發(fā)送數(shù)據(jù)
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:讀取數(shù)據(jù)到緩沖區(qū)中
Seek:定位流的當(dāng)前位置
TBlobStream:根據(jù)一個(gè)TBlobField字段建立一個(gè)流對(duì)象
Truncate:從當(dāng)前位置截短流對(duì)象
Write:將緩沖區(qū)中的數(shù)據(jù)寫入到流對(duì)象中
TBlobStream流對(duì)象只用于對(duì)TblobField進(jìn)行操作,
注意,當(dāng)改變了數(shù)據(jù)集對(duì)象的當(dāng)前記錄時(shí),
要重新建立TBlobStream對(duì)象并在使用完后將之刪除。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//讀取Blob字段的數(shù)據(jù)
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:通過一個(gè)流界面建立Ole流對(duì)象
Read:從流對(duì)象中讀數(shù)據(jù)到緩沖區(qū)中
Seek:定位流的當(dāng)前位置
Write:從緩沖區(qū)中將數(shù)據(jù)寫入到流對(duì)象中
七. TStringStream介紹
屬性
DataString:流對(duì)象的實(shí)際存儲(chǔ)字符串
Size:流對(duì)象大小
方法
Read:從流對(duì)象中讀數(shù)據(jù)到緩沖區(qū)中
ReadString:以字符串形式返回流中指定數(shù)據(jù)
Seek:定位流的當(dāng)前位置
TStringStream:根據(jù)一個(gè)字符串建立字符串流對(duì)象
Write:從緩沖區(qū)中將數(shù)據(jù)寫入到流對(duì)象中
WriteString:將字符串中數(shù)據(jù)寫入到流中
八. TFileStream介紹
方法
TFileStream:根據(jù)文件名建立或打開一個(gè)文件,并建立相應(yīng)的文件流對(duì)象
例:TFileStream *fsBootINI = new
TFileStream(“c:\boot.ini”,fmOpenRead);
九. TMemoryStream介紹
方法
Clear:清除流對(duì)象中所有數(shù)據(jù)
LoadFromFile:從文件中讀入數(shù)據(jù)到流對(duì)象中
LoadFromStream:從其它流中讀入數(shù)據(jù)
SetSize:設(shè)置流對(duì)象的大小
Write:從緩沖區(qū)中寫數(shù)據(jù)到內(nèi)存流中
十. TClientBlobStream介紹
方法
TClientBlobStream:根據(jù)TblobField對(duì)象建立一個(gè)流對(duì)象
Truncate:截短流
Write:將緩沖區(qū)中數(shù)據(jù)寫入到流中
該流對(duì)象用來操作TClientDataSet數(shù)據(jù)集中的BLOB類型的字段
十一. TResourceStream介紹
方法
TResourceStream:根據(jù)EXE文件名柄或DLL文件句柄和資源描述生成流對(duì)象
Write:不支持寫操作,產(chǎn)生異常
十二. 與流對(duì)象相關(guān)的對(duì)象介紹
TFilter
+--------------------------+
|
|
TReader TWriter
以上對(duì)象用于將組件寫入到流對(duì)象中或是從流對(duì)象生成組件
流對(duì)象中的方法ReadComponent
和WriteComponent在實(shí)現(xiàn)時(shí)就是使用TReader和TWriter來實(shí)際操作的。
十三. 與流對(duì)象相關(guān)的函數(shù)
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);
以上函數(shù)都是針對(duì)存儲(chǔ)對(duì)象的流而言的,在流之間轉(zhuǎn)換流中所存儲(chǔ)對(duì)象的描述方式。