• <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)  編輯 收藏 引用
            亚洲v国产v天堂a无码久久| 伊色综合久久之综合久久| 久久久SS麻豆欧美国产日韩| 久久免费看黄a级毛片| 超级97碰碰碰碰久久久久最新 | 久久精品成人免费看| 99久久婷婷国产一区二区| 一级做a爰片久久毛片毛片| 久久精品天天中文字幕人妻 | 亚洲综合精品香蕉久久网| 精品国产一区二区三区久久| 热综合一本伊人久久精品| 少妇高潮惨叫久久久久久| 国产国产成人久久精品| 免费观看久久精彩视频| 久久免费高清视频| 久久久久久久久波多野高潮| 日本久久久精品中文字幕| 亚洲精品美女久久久久99| 久久亚洲国产成人精品无码区| 久久一区二区三区99| 99久久婷婷国产综合亚洲| 久久免费视频1| 精品久久久久中文字幕一区| 人妻无码久久一区二区三区免费| 久久免费看黄a级毛片| 久久久久国色AV免费观看| 九九热久久免费视频| 久久免费视频观看| 久久99精品国产99久久| 精品蜜臀久久久久99网站| 日韩人妻无码精品久久久不卡 | 久久精品国产一区二区电影| 久久亚洲国产精品一区二区| 精品久久久久久成人AV| 国内精品伊人久久久久av一坑| 午夜精品久久久久久中宇| 色婷婷久久综合中文久久蜜桃av| 无码人妻久久一区二区三区蜜桃| 伊人久久大香线蕉综合5g| 久久久久久久久久久久久久|