• <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ā). 勤為槳,思為帆

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

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

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

             

             

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


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

             


            2 流對(duì)象的屬性及方法簡(jiǎn)介
            關(guān)于各屬性和方法的詳細(xì)語法請(qǐng)見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ù)寫入到流中,返回寫入的字節(jié)數(shù)
                    WriteBuffer: 從緩沖區(qū)中將一定字節(jié)的數(shù)據(jù)寫入到流中,失敗則異常
                    WriteComponent:將一組件寫入到流中
                    WriteComponentRes:將一組件以Windows資源文件的格式寫入到流中


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

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

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

              fileHandle = FileOpen(“c:\config.sys”,fmOpenRead);
              if(fileHandle == -1)
                 return ;  //打開文件出錯(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)注意一定要先注銷流對(duì)象才能關(guān)閉句柄

             

            三. TCustomMemoryStream介紹
            屬性
                    Memory:指向內(nèi)存流對(duì)象的實(shí)際內(nèi)存的指針,可用該指針直接訪問內(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)存池

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

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

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

            下列是一個(gè)用TWinSocketStream進(jìn)行收發(fā)數(shù)據(jù)的代碼片段:
            /////////////////////////////////////////////////////////////////////////////////////////////////////
            //在一單獨(dú)的線程中通過阻塞式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ù)寫入到流對(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:通過一個(gè)流界面建立Ole流對(duì)象
                    Read:從流對(duì)象中讀數(shù)據(jù)到緩沖區(qū)中
                    Seek:定位流的當(dāng)前位置
                    Write:從緩沖區(qū)中將數(shù)據(jù)寫入到流對(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ù)寫入到流對(duì)象中
                    WriteString:將字符串中數(shù)據(jù)寫入到流中

            八. TFileStream介紹
            方法
                    TFileStream:根據(jù)文件名建立或打開一個(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ū)中寫數(shù)據(jù)到內(nèi)存流中

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

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

            十二. 與流對(duì)象相關(guān)的對(duì)象介紹
            TFilter
            +--------------------------+
            |                 |
            TReader        TWriter
            以上對(duì)象用于將組件寫入到流對(duì)象中或是從流對(duì)象生成組件
            流對(duì)象中的方法ReadComponent 和WriteComponent在實(shí)現(xiàn)時(shí)就是使用TReader和TWriter來實(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 閱讀(1022) 評(píng)論(0)  編輯 收藏 引用

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


            思思久久好好热精品国产| 国产精品欧美久久久久无广告| 欧美性猛交xxxx免费看久久久| 久久综合伊人77777麻豆| 天天躁日日躁狠狠久久 | 日本道色综合久久影院| 日本三级久久网| 久久99热这里只有精品国产| 久久精品水蜜桃av综合天堂| 国产国产成人久久精品| 中文字幕无码精品亚洲资源网久久| 国产情侣久久久久aⅴ免费| 四虎影视久久久免费| …久久精品99久久香蕉国产| 日韩亚洲国产综合久久久| 久久精品夜夜夜夜夜久久| 久久乐国产精品亚洲综合| 97久久久久人妻精品专区| 国内精品综合久久久40p| 久久无码国产| 亚洲狠狠综合久久| 99久久精品费精品国产一区二区| 久久久久久亚洲精品影院| 国产AV影片久久久久久| 久久久久久狠狠丁香| 国产V亚洲V天堂无码久久久| 国产69精品久久久久APP下载| 久久国产精品一区| 国产精品欧美久久久久天天影视 | 久久久久久噜噜精品免费直播 | 日本久久久久久久久久| 青青草国产成人久久91网| 无码国内精品久久人妻蜜桃| 亚洲中文字幕无码一久久区| 国产精品一区二区久久精品涩爱| 午夜视频久久久久一区| 久久精品国产清自在天天线| 99久久免费只有精品国产| 狠狠色综合网站久久久久久久| 99久久精品国产一区二区三区| 9191精品国产免费久久|