C++Builder 提供豐富的流類別體系,統一抽象「字節序列」的讀寫、定位、複製、組件持久化等操作。本文梳理所有流類的繼承關係、核心屬性方法,並給出典型使用場景指引。
TObject └─ TStream (抽象基類) ├─ THandleStream (句柄基礎) │ └─ TFileStream (文件流) ├─ TCustomMemoryStream (內存基礎) │ └─ TMemoryStream (動態內存流) │ ├─ TStringStream (字符串流) │ └─ TResourceStream (資源流) ├─ TWinSocketStream (Socket 異步流) ├─ TBlobStream (數據庫 Blob 流) │ └─ TClientBlobStream (ClientDataSet Blob) └─ TOleStream (OLE 復合文檔流)
| 成員 | 類型 | 說明 |
|---|---|---|
Position | 屬性 Int64 | 當前讀寫指針位置 (0-based) |
Size | 屬性 Int64 | 流總字節數 |
Read(Buffer, Count) | 方法 | 讀取 ≤Count 字節到緩衝區,返回實際讀取數 |
ReadBuffer(Buffer, Count) | 方法 | 強制讀滿 Count 字節,失敗拋 EReadError |
Write(Buffer, Count) | 方法 | 從緩衝區寫入 ≤Count 字節,返回實際寫入數 |
WriteBuffer(Buffer, Count) | 方法 | 強制寫滿 Count 字節,失敗拋 EWriteError |
Seek(Offset, Origin) | 方法 | 移動指針,Origin: soBeginning/soCurrent/soEnd |
CopyFrom(Source, Count) | 方法 | 從 Source 流複製 Count 字節 (Count=0 表示全複製) |
ReadComponent/WriteComponent | 方法 | 組件二進制持久化 (DFM 格式) |
ReadComponentRes/WriteComponentRes | 方法 | Windows 資源格式持久化 |
SetSize(NewSize) | 方法 | 調整流大小 (截斷/擴展) |
| 類別 | 適用場景 | 關鍵構造/特性 |
|---|---|---|
TFileStream | 磁盤文件讀寫 | Create(FileName, Mode),Mode: fmCreate/fmOpenRead/fmOpenWrite/fmShareDenyNone… |
TMemoryStream | 內存緩衝區讀寫、對象序列化 | 自動擴容,SaveToFile/LoadFromFile 落地 |
TStringStream | 字符串作流操作 (構建 SQL/JSON/HTTP 體) | DataString 屬性直接訪問內容 |
TResourceStream | 讀取 EXE/DLL 嵌入資源 (RCDATA/位圖/圖標) | Create(HInstance, ResName, RT_RCDATA) |
TWinSocketStream | 非阻塞 Socket 讀寫超時控制 | 綁定 TCustomWinSocket,WaitForData(timeout) |
TBlobStream | 數據集 Blob 字段讀寫 | Create(Field, Mode),自動處理 Blob 碎片 |
TOleStream | OLE 復合文檔 (Structured Storage) 流 | 實現 IStream 接口,互操作 COM |
TMemoryStream* ms = new TMemoryStream;
try {
ms->LoadFromFile("data.bin");
// 直接訪問 ms->Memory, ms->Size
} __finally { delete ms; }
TFileStream* src = new TFileStream("in.dat", fmOpenRead);
TFileStream* dst = new TFileStream("out.dat", fmCreate);
try {
dst->CopyFrom(src, 0); // 0 = 全部複製
} __finally { delete src; delete dst; }
TMemoryStream* ms = new TMemoryStream;
try {
ms->WriteComponent(Button1); // 將 Button1 寫入流
ms->Position = 0;
TButton* btn2 = dynamic_cast<TButton*>(ms->ReadComponent(nil)); // 還原
btn2->Parent = this;
btn2->SetBounds(10, 10, 75, 25);
} __finally { delete ms; }
TStringStream* ss = new TStringStream("", TEncoding::UTF8);
try {
ss->WriteString("SELECT * FROM ");
ss->WriteString(tableName);
ss->WriteString(" WHERE id = ");
ss->WriteString(IntToStr(id));
String sql = ss->DataString; // 直接取結果
} __finally { delete ss; }
try__finally 保護流對象**,防洩漏;TFileStream + CopyFrom,避免全讀入內存;TMemoryStream 可直接 Memory 指針零拷貝交互 C API;TStream 為抽象類,**不可直接實例化**。熟練運用流體系,能將文件、內存、網絡、資源、數據庫、COM 等異構數據源統一為「可讀寫字節序列」抽象,極大簡化 I/O 邏輯。