• <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

            厚積薄發(fā). 勤為槳,思為帆

               :: 首頁(yè) :: 新隨筆 ::  :: 聚合  :: 管理 ::
              73 隨筆 :: 4 文章 :: 22 評(píng)論 :: 0 Trackbacks

            轉(zhuǎn)自網(wǎng)絡(luò),流的概念主要在cbuilder  和delphi編程環(huán)境下的處理,使用流有以下方面

            • 1. 使用統(tǒng)一的流的概念來(lái)操作各種不同類(lèi)型的資源。
              2. 通過(guò)流將資源保存到不同的介質(zhì)上,如將組件保存到文件中,將ICON資源調(diào)入內(nèi)存等。 3. 簡(jiǎn)化一些對(duì)象的操作,如TBlobStream和TClientBlobStream
              4. 實(shí)現(xiàn)一些原來(lái)不好實(shí)現(xiàn)的功能,如TWinSocketStream實(shí)現(xiàn)超時(shí)操作

             

             

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


            下面是以上各類(lèi)的繼承關(guān)系
            TObject
              |
            TStream
              |
            +---------------------------+---------------------------+--------------------+-------------------+------------+
            |                  |                  |              |            |        |
            THandleStream TCustomMemoryStream TWinsocketStream TBlobStream TOleStream  TStringStream
            |                  |
            TFileStream  TMemoryStream
                                |
                        +-----------------------------+
                        |                            |
                    TClientBlobStream          TResourceStream

             


            2 流對(duì)象的屬性及方法簡(jiǎn)介
            關(guān)于各屬性和方法的詳細(xì)語(yǔ)法請(qǐng)見(jiàn)CBUILDER的幫助

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


            二. THandleStream介紹
            屬性
                    Handle:流對(duì)象要讀寫(xiě)的通迅資源的句柄
                    Size:句柄所標(biāo)識(shí)的資源的大小,單位為字節(jié)
            方法
                    Read:從流中讀數(shù)據(jù)到緩沖區(qū)中
                    Seek:設(shè)置流的當(dāng)前位置
                    SetSize:設(shè)置流的大小,不成功則返回一個(gè)異常
                    THandleStream:通過(guò)一個(gè)打開(kāi)的句柄建立一個(gè)句柄流對(duì)象
                    Write:將數(shù)據(jù)從緩沖區(qū)中寫(xiě)入到流

            可以使用THandleStream流對(duì)象來(lái)存取如文件、套接字、命名管道、郵槽等打開(kāi)了句柄的通迅資源。

            采用句柄流對(duì)象進(jìn)行文件操作的片段代碼:
            //////////////////////////////////////////////////////////////////////////////////////////////
            //將c:config.sys文件中的內(nèi)容讀入到一個(gè)文本框中
            int fileHandle;
            THandleStream *fileStream;

              fileHandle = FileOpen(“c:\config.sys”,fmOpenRead);
              if(fileHandle == -1)
                 return ;  //打開(kāi)文件出錯(cuò)

              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); //請(qǐng)注意一定要先注銷(xiāo)流對(duì)象才能關(guān)閉句柄

             

            三. TCustomMemoryStream介紹
            屬性
                    Memory:指向內(nèi)存流對(duì)象的實(shí)際內(nèi)存的指針,可用該指針直接訪問(wèn)內(nèi)存流的內(nèi)存
            方法
                    Read:從流中讀數(shù)據(jù)到緩沖區(qū)中
                    SaveToFile:將內(nèi)存流中的數(shù)據(jù)保存到文件中
                    SaveToStream:將內(nèi)存流中的數(shù)據(jù)保存到其它流對(duì)象中
                    Seek:設(shè)置流對(duì)象的當(dāng)前位置
                    SetPointer:設(shè)置與內(nèi)存流對(duì)象相關(guān)聯(lián)的內(nèi)存池

                該類(lèi)為純虛類(lèi),不能直接建立其對(duì)象。
                應(yīng)使用TMemoryStream或是TResourceStream。

            四. TWinSocketStream介紹
            屬性
                    TimeOut:設(shè)置在讀或?qū)慡ocket時(shí)的超時(shí)值,單位:毫秒
            方法
                    Read:從Socket中讀取指定字節(jié)的數(shù)據(jù)到緩沖區(qū)中,返回實(shí)際讀取的字節(jié)數(shù)
                    Seek:沒(méi)有意義
                    TWinSocketStream:根據(jù)指定的Socket句柄和超時(shí)時(shí)間建立一個(gè)Socket流對(duì)象
                    WaitForData:確認(rèn)是否可以通過(guò)Socket連接來(lái)發(fā)送或接收數(shù)據(jù)了。
                    Write:通過(guò)Socket連接發(fā)送緩沖區(qū)中指定字節(jié)的數(shù)據(jù)

            TWinSocketStream流對(duì)象用來(lái)在阻塞方式的Socket連接中發(fā)送和接收數(shù)據(jù),
            從而避免一般情況下的掛起現(xiàn)象。

            下列是一個(gè)用TWinSocketStream進(jìn)行收發(fā)數(shù)據(jù)的代碼片段:
            /////////////////////////////////////////////////////////////////////////////////////////////////////
            //在一單獨(dú)的線程中通過(guò)阻塞式Socket連接發(fā)送數(shù)據(jù)
            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:讀取數(shù)據(jù)到緩沖區(qū)中
                    Seek:定位流的當(dāng)前位置
                    TBlobStream:根據(jù)一個(gè)TBlobField字段建立一個(gè)流對(duì)象
                    Truncate:從當(dāng)前位置截短流對(duì)象
                    Write:將緩沖區(qū)中的數(shù)據(jù)寫(xiě)入到流對(duì)象中
             
             TBlobStream流對(duì)象只用于對(duì)TblobField進(jìn)行操作,
             注意,當(dāng)改變了數(shù)據(jù)集對(duì)象的當(dāng)前記錄時(shí),
             要重新建立TBlobStream對(duì)象并在使用完后將之刪除。
            //////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //讀取Blob字段的數(shù)據(jù)
            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:通過(guò)一個(gè)流界面建立Ole流對(duì)象
                    Read:從流對(duì)象中讀數(shù)據(jù)到緩沖區(qū)中
                    Seek:定位流的當(dāng)前位置
                    Write:從緩沖區(qū)中將數(shù)據(jù)寫(xiě)入到流對(duì)象中

            七. TStringStream介紹
            屬性
                    DataString:流對(duì)象的實(shí)際存儲(chǔ)字符串
                    Size:流對(duì)象大小
            方法
                    Read:從流對(duì)象中讀數(shù)據(jù)到緩沖區(qū)中
                    ReadString:以字符串形式返回流中指定數(shù)據(jù)
                    Seek:定位流的當(dāng)前位置
                    TStringStream:根據(jù)一個(gè)字符串建立字符串流對(duì)象
                    Write:從緩沖區(qū)中將數(shù)據(jù)寫(xiě)入到流對(duì)象中
                    WriteString:將字符串中數(shù)據(jù)寫(xiě)入到流中

            八. TFileStream介紹
            方法
                    TFileStream:根據(jù)文件名建立或打開(kāi)一個(gè)文件,并建立相應(yīng)的文件流對(duì)象
            例:TFileStream *fsBootINI = new TFileStream(“c:\boot.ini”,fmOpenRead);


            九. TMemoryStream介紹
            方法
                    Clear:清除流對(duì)象中所有數(shù)據(jù)
                    LoadFromFile:從文件中讀入數(shù)據(jù)到流對(duì)象中
                    LoadFromStream:從其它流中讀入數(shù)據(jù)
                    SetSize:設(shè)置流對(duì)象的大小
                    Write:從緩沖區(qū)中寫(xiě)數(shù)據(jù)到內(nèi)存流中

            十. TClientBlobStream介紹
            方法
                    TClientBlobStream:根據(jù)TblobField對(duì)象建立一個(gè)流對(duì)象
                    Truncate:截短流
                    Write:將緩沖區(qū)中數(shù)據(jù)寫(xiě)入到流中
            該流對(duì)象用來(lái)操作TClientDataSet數(shù)據(jù)集中的BLOB類(lèi)型的字段

            十一. TResourceStream介紹
            方法
            TResourceStream:根據(jù)EXE文件名柄或DLL文件句柄和資源描述生成流對(duì)象
                    Write:不支持寫(xiě)操作,產(chǎn)生異常

            十二. 與流對(duì)象相關(guān)的對(duì)象介紹
            TFilter
            +--------------------------+
            |                 |
            TReader        TWriter
            以上對(duì)象用于將組件寫(xiě)入到流對(duì)象中或是從流對(duì)象生成組件
            流對(duì)象中的方法ReadComponent 和WriteComponent在實(shí)現(xiàn)時(shí)就是使用TReader和TWriter來(lái)實(shí)際操作的。

            十三. 與流對(duì)象相關(guān)的函數(shù)

            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);

            以上函數(shù)都是針對(duì)存儲(chǔ)對(duì)象的流而言的,在流之間轉(zhuǎn)換流中所存儲(chǔ)對(duì)象的描述方式。

             

             


             

            posted on 2006-08-19 13:45 kenlistian 閱讀(1025) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            一本大道加勒比久久综合| 亚洲精品乱码久久久久久自慰| 国产美女久久精品香蕉69| 欧美午夜精品久久久久免费视| 国产精品久久久久久福利漫画| 亚洲午夜久久久精品影院| 伊人久久亚洲综合影院| 狠狠色婷婷久久一区二区三区| 国产精品成人无码久久久久久| 久久婷婷五月综合色奶水99啪| 国产精品久久久久无码av| 亚洲国产成人精品久久久国产成人一区二区三区综 | 亚洲精品美女久久久久99| 嫩草伊人久久精品少妇AV| 久久国产精品免费| 国产麻豆精品久久一二三| 亚洲精品97久久中文字幕无码 | 久久久久久a亚洲欧洲aⅴ| 久久人人爽人人爽AV片| 国产精品久久久久9999高清| 久久午夜无码鲁丝片秋霞| 久久www免费人成看国产片| 97久久精品无码一区二区| 囯产精品久久久久久久久蜜桃| 欧美久久久久久午夜精品| 亚洲国产精久久久久久久| 99久久国产热无码精品免费| 一本一本久久a久久综合精品蜜桃 一本一道久久综合狠狠老 | 国产精品欧美久久久天天影视| 国产A级毛片久久久精品毛片| 无码人妻少妇久久中文字幕| 国产精品激情综合久久| segui久久国产精品| 国产亚洲欧美成人久久片 | 久久久久国产精品嫩草影院| 久久精品国产福利国产秒| 久久99精品国产麻豆宅宅| 热久久这里只有精品| 一本大道加勒比久久综合| 精品久久国产一区二区三区香蕉| 蜜桃麻豆www久久|