• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            kenlistian

            厚積薄發. 勤為槳,思為帆

               :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理 ::
              73 隨筆 :: 4 文章 :: 22 評論 :: 0 Trackbacks

            轉自網絡,流的概念主要在cbuilder  和delphi編程環境下的處理,使用流有以下方面

            • 1. 使用統一的流的概念來操作各種不同類型的資源。
              2. 通過流將資源保存到不同的介質上,如將組件保存到文件中,將ICON資源調入內存等。 3. 簡化一些對象的操作,如TBlobStream和TClientBlobStream
              4. 實現一些原來不好實現的功能,如TWinSocketStream實現超時操作

             

             

            1.概述cbuilder流
            在CBUILDER中,存在以下幾種流對象:
            TFileStream
            TMemoryStream
            TStringStream
            TWinSocketStream
            TBlobStream
            TOleStream
            TClientBlobStream
            TResourceStream


            下面是以上各類的繼承關系
            TObject
              |
            TStream
              |
            +---------------------------+---------------------------+--------------------+-------------------+------------+
            |                  |                  |              |            |        |
            THandleStream TCustomMemoryStream TWinsocketStream TBlobStream TOleStream  TStringStream
            |                  |
            TFileStream  TMemoryStream
                                |
                        +-----------------------------+
                        |                            |
                    TClientBlobStream          TResourceStream

             


            2 流對象的屬性及方法簡介
            關于各屬性和方法的詳細語法請見CBUILDER的幫助

            一. TStream介紹
            屬性
                    Position:當前位置指針
                    Size:流的大小,單位為字節
            方法
                    CopyFrom:   從一個流往另一個流拷貝數據
                    Read:       從流中讀取一定字節的數據到緩沖區,返回讀取的字節數
                    ReadBuffer: 從流中讀取一定字節的數據到緩沖區,如不正確則異常
                    ReadComponent:從流中取出一個組件
                    ReadComponentRes:以Windows的資源文件格式從流中讀取一組件
                    Seek:         定位流的當前位置指針
                    SetSize:     設置流的大小。
                    Write:       從緩沖區中將一定字節的數據寫入到流中,返回寫入的字節數
                    WriteBuffer: 從緩沖區中將一定字節的數據寫入到流中,失敗則異常
                    WriteComponent:將一組件寫入到流中
                    WriteComponentRes:將一組件以Windows資源文件的格式寫入到流中


            二. 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:設置流對象的大小
                    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);

            以上函數都是針對存儲對象的流而言的,在流之間轉換流中所存儲對象的描述方式。

             

             


             

            posted on 2006-08-19 13:45 kenlistian 閱讀(1022) 評論(0)  編輯 收藏 引用
            精品一二三区久久aaa片| 99久久夜色精品国产网站| 欧美亚洲国产精品久久| 777午夜精品久久av蜜臀| 日韩精品久久久久久免费| 久久精品这里热有精品| 亚洲精品国精品久久99热| 国内精品久久国产大陆| 久久五月精品中文字幕| 久久综合国产乱子伦精品免费| 久久久久久久尹人综合网亚洲| 久久国产精品无| 国产高清美女一级a毛片久久w| 91麻豆国产精品91久久久| 国产99久久久久久免费看| 亚洲中文字幕无码一久久区| 99久久www免费人成精品| 久久久久亚洲AV无码观看| 久久综合中文字幕| 久久精品国产精品亚洲毛片 | 久久久久99精品成人片直播| 国产激情久久久久影院老熟女免费| 99精品久久久久久久婷婷| 日日狠狠久久偷偷色综合96蜜桃| 国产精品久久久久久久久鸭| 色88久久久久高潮综合影院| 无码乱码观看精品久久| 久久99精品国产麻豆不卡| 日韩亚洲欧美久久久www综合网| 久久久无码精品亚洲日韩蜜臀浪潮| 久久天天躁狠狠躁夜夜躁2014| 欧美精品福利视频一区二区三区久久久精品 | 99久久精品国产高清一区二区| 亚洲中文字幕无码久久2020| 久久精品国产2020| 亚洲精品无码久久久影院相关影片| 亚洲精品NV久久久久久久久久| 午夜福利91久久福利| 无码人妻久久一区二区三区蜜桃 | 久久99久久99精品免视看动漫| 香蕉久久av一区二区三区|