• <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 閱讀(1025) 評論(0)  編輯 收藏 引用
            久久精品国产第一区二区三区| 国产成人无码久久久精品一| 色婷婷噜噜久久国产精品12p| 久久精品夜色噜噜亚洲A∨| 亚洲国产天堂久久久久久| 精品久久久无码人妻中文字幕| 麻豆成人久久精品二区三区免费| 精品久久777| 伊人久久大香线蕉综合网站| 久久99国产综合精品| 久久精品亚洲欧美日韩久久| 麻豆一区二区99久久久久| 欧美一级久久久久久久大| 欧美一区二区三区久久综| 无码人妻少妇久久中文字幕| 久久国产精品久久| 亚洲第一极品精品无码久久| 久久久久亚洲精品中文字幕| 成人久久久观看免费毛片| 久久人做人爽一区二区三区| 中文字幕成人精品久久不卡| 久久婷婷五月综合色奶水99啪| 中文字幕精品无码久久久久久3D日动漫 | 久久夜色精品国产噜噜亚洲AV| 久久996热精品xxxx| 久久99国产精品二区不卡| 久久天天躁夜夜躁狠狠| 一级女性全黄久久生活片免费| 狠狠色伊人久久精品综合网| 香蕉久久夜色精品国产小说| 久久久久亚洲av无码专区| 无码日韩人妻精品久久蜜桃| 久久精品国产亚洲av麻豆蜜芽| 色诱久久av| 久久精品卫校国产小美女| 日本精品久久久久久久久免费| 久久免费观看视频| 亚洲日韩欧美一区久久久久我| 亚洲国产成人久久一区WWW| 亚洲七七久久精品中文国产| 久久精品无码一区二区三区日韩|