首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

C++Builder 流對象體系全景:TStream 繼承樹與核心操作指南

     編輯:VC 教學

C++Builder 提供豐富的流類別體系,統一抽象「字節序列」的讀寫、定位、複製、組件持久化等操作。本文梳理所有流類的繼承關係、核心屬性方法,並給出典型使用場景指引。

流類繼承樹

TObject
└─ TStream (抽象基類)
   ├─ THandleStream          (句柄基礎)
   │   └─ TFileStream        (文件流)
   ├─ TCustomMemoryStream    (內存基礎)
   │   └─ TMemoryStream      (動態內存流)
   │       ├─ TStringStream  (字符串流)
   │       └─ TResourceStream (資源流)
   ├─ TWinSocketStream       (Socket 異步流)
   ├─ TBlobStream            (數據庫 Blob 流)
   │   └─ TClientBlobStream  (ClientDataSet Blob)
   └─ TOleStream             (OLE 復合文檔流)

TStream 核心屬性與方法 (所有流通用)

成員類型說明
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 碎片
TOleStreamOLE 復合文檔 (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 邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved