C溫故而知新Stream篇六BufferedStream_第1頁
C溫故而知新Stream篇六BufferedStream_第2頁
C溫故而知新Stream篇六BufferedStream_第3頁
C溫故而知新Stream篇六BufferedStream_第4頁
C溫故而知新Stream篇六BufferedStream_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

BufferedStream目錄:?????如何理解裝飾模式?再次理解下裝飾模式在Stream中的作用?????1簡單介紹一下BufferedStream在前幾章的表達中

,我們已經(jīng)可以掌握流的基本特點和特點,

一般進行對流的辦理時系統(tǒng)肩負著IO

所帶來的開銷,調(diào)用十分頻頻

,這時候就應該想個方法去減少這種開銷,而且必定在已有

Stream

進行擴展,有了以上

2點需求,那么我們今天的主題,BufferedStream閃亮登場了,BufferedStream可以實現(xiàn)流的緩存,換句話說也就是在內(nèi)存中可以緩存必然的數(shù)據(jù)而不是時時給系統(tǒng)帶來負擔,同時BufferedStream可以對緩存中的數(shù)據(jù)進行寫入或是讀取,所以對流的性能帶來必然的提升,但是無法同時進行讀取或?qū)懭牍ぷ鳎羰遣皇褂镁彌_區(qū)也行,BufferedStream可以保證不用緩沖區(qū)時不會降低因緩沖區(qū)帶來的讀取或?qū)懭胄阅艿南陆等绾卫斫饩彌_區(qū)緩沖區(qū)是內(nèi)存中的一塊連續(xù)地域,用來緩存或臨時儲藏數(shù)據(jù),也就是說流可以經(jīng)過緩沖區(qū)漸漸對數(shù)據(jù)進行讀取或?qū)懭氩僮?,BufferedStream中的緩存區(qū)可以由用戶設定,其表現(xiàn)形式為byte數(shù)組,想象下沒有緩存區(qū)將是很可怕的,若是我們的非固態(tài)硬盤沒有緩沖區(qū),若是我們下載速度達到驚人的10m左右,那么下載一個2G或更大的文件時,磁頭的讀寫是特別的頻頻,直接的結(jié)果是磁頭壽命急劇減少,甚至將硬盤直接燒毀也許損壞3BufferedStream

的優(yōu)勢理解了緩沖區(qū)的重要性后,讓我們在來談下為什么MemoryStream同樣

BufferedStream

的優(yōu)勢,第一大家必然覺的誘惑也是在內(nèi)存中對流進行操作,和

BufferedStream

有什么差異呢?

BufferedStream

其實不是將所有內(nèi)容都存放到內(nèi)存中

,而

MemoryStream

則是。BufferedStream

必定跟其他流如

FileStream

結(jié)合使用,而MemoryStream

則不用,聰穎的你必然可以想到,

BufferedStream

必然近似于一個流的包裝類,

對流進行”緩存功能的擴展包裝

”,所以

BufferedStream

的優(yōu)勢不但表現(xiàn)在其原有的緩存功能上,更表現(xiàn)在如何幫助原有類實現(xiàn)其功能的擴展層面上4從BufferedStream中簡單學習下裝飾模式如何理解裝飾模式我們在做項目時也許設計項目時常常會碰到這個問題:我們該如何擴展已有的類功能也許若是擴展一系列派生類的功能呢,可能你立刻會想到繼承,的確不錯,但是若是你仔細看以下圖而且張開必然的想象的話,你就會發(fā)現(xiàn)繼承可能以致子類的膨脹性增加,以以下圖所示第一還是得注意以下原則:多用組合,少用繼承。利用繼承設計子類的行為,是在編譯時靜態(tài)決定的,而且所有的子類都會繼承到同樣的行為。但是,若是可以利用組合的做法擴展對象的行為,就可以在運行時動向地進行擴展。類應設計的對擴張開放,對更正關閉。那么我們該如何防備子類的擴大同時又實現(xiàn)Girl類原有類或派生類的新功能呢?第一我們要達到2個目的:1可以為Girl的所有派生類都實現(xiàn)新功能(不更正派生類的構(gòu)造)利用對象組合的方式為了滿足為Girl類所有派生類都能使用,那么我們就加上一個Girl的裝飾類GirlWrapper:publicabstractclassGirlWrapper:Girl{protectedGirlgirl;publicGirlWrapper(GirlthisGril){=thisGril;}publicoverridevoidDecrorator(){();}publicoverridestringToString(){return("{0}:{1}",}}該類繼承了Girl類,從而保證了和其他派生類有共同的基本構(gòu)造,既然有了這個裝飾類,那我們便可以刪掉原來的Singing接口,增加一個SingingGirlWrapper類來實現(xiàn)對girl的包裝類,publicclassSingingGirlWrapper:GirlWrapper{publicSingingGirlWrapper(GirlthisGril):base(thisGril){}publicvoidDecorator(){("SingingGirlWrapperdecorateor:Thegirlnamed{0}whofrom{1}is{2}cansingingnao",,,();}publicoverridestringToString(){return();}}大家不用拘泥于派生的包裝類,你完好可以建立一個新的

girl

包裝類來實現(xiàn)特定的功能,上述例子可是演示下派生的包裝類這樣的話,我們便使用了組合的方式實現(xiàn)了既保留原有的接口(也許抽象類),又動向增加了新功能在使用時我們可以將派生類的對象放入裝飾類的構(gòu)造中,這樣的話,在執(zhí)行包裝類Decorator方法時,可以執(zhí)行被包裝對象的Decorator方法和包裝類的Decorator方法從而實現(xiàn)對Girl派生類的包裝,這樣的話就能實現(xiàn)靈便的組合擴展。static

void

Main(

string

[]args){Queenqueen=SingingGirlWrapper

newQueen(sgw

"Mary","UniteStates");=newSingingGirlWrapper(queen);();();}再次理解下裝飾模式在Stream中的作用經(jīng)過以上的例子在回到BufferStream章節(jié)中,大家必然一眼就看出了BufferStream其實就是上述例子中的wrapper類,而Stream類就是其共同的父類,為了給所有的流類供應緩沖功能所以BufferedStream便出生了,這樣的話,我們可以不用更正其派生類構(gòu)造,便能靈便組合將緩沖功能嵌入stream中5BufferedStream的構(gòu)造BufferedStream(Stream)其實BufferedStream的構(gòu)造主要功能還是設置緩沖區(qū)大小,若是沒有指定則默認是用4096字節(jié)的進行初始化BufferedStream(Stream,Int32)第二個參數(shù)是手動指定緩沖區(qū)大小第一次使用此構(gòu)造函數(shù)初始化BufferedStream對象時分配共享讀/寫緩沖區(qū)。若是所有的讀和寫都大于或等于緩沖區(qū)大小,則不使用共享緩沖區(qū)。6BufferedStream的屬性*1CanRead已重寫。獲取一個值,該值指示當前流可否支持讀取。若是流支持讀取,則為true;若是流已關閉或是經(jīng)過只寫接見方式打開的,則為false。若是從Stream派生的類不支持讀取,則對StreamReader、StringReader、TextReader的Read、ReadByte、BeginRead、EndRead和Peek方法的調(diào)用將惹起NotSupportedException。若是該流已關閉,此屬性將返回false。*2CanSeek已重寫。獲取一個值,該值指示當前流可否支持查找。若是流支持查找,則為true;若是流已關閉也許若是流是由操作系統(tǒng)句柄(如管道或到控制臺的輸出)構(gòu)造的,則為false。若是從Stream派生的類不支持查找,則對Length、SetLength、Position和Seek的調(diào)用將惹起NotSupportedException。若是該流已關閉,此屬性將返回false。*3CanWrite已重寫。獲取一個值,該值指示當前流可否支持寫入。若是流支持寫入,則為true;若是流已關閉或是經(jīng)過只讀接見方式打開的,則為false。若是從Stream派生的類不支持寫入,則調(diào)用SetLength、Write或WriteByte將惹起NotSupportedException。若是該流已關閉,此屬性將返回false。*4Length已重寫。獲取流長度,長度以字節(jié)為單位。*5Position已重寫。獲取當前流內(nèi)的地址。get接見器調(diào)用Seek獲取基礎流中的當前地址,爾后依照緩沖區(qū)中的當前地址調(diào)整此值。set接見器將以前寫入緩沖區(qū)的所有數(shù)據(jù)都復制到基礎流中,爾后調(diào)用Seek。支持找尋到超出流長度的任何地址。7BufferedStream的方法BufferStream的方法基本上和Stream類一致,沒有其獨到的方法8簡單示例:利用socket讀取網(wǎng)頁并保留在當?shù)豤lassProgram{staticvoidMain(string[]args){Serverserver

=newServer(

"");();}}publicclassServer{端口constintwebPort=80;默認接收緩存大小byte[]receiveBufferBytes=newbyte[4096];需要獲取網(wǎng)頁的urlprivatestringwebPageURL;publicServer(stringwebPageUrl){webPageURL=webPageUrl;}<summary>從該網(wǎng)頁上獲取數(shù)據(jù)</summary>publicvoidFetchWebPageData(){if(!(webPageURL))FetchWebPageData(webPageURL);();}<summary>從該網(wǎng)頁上獲取數(shù)據(jù)</summary>///<paramname="webPageURL">privatevoidFetchWebPageData(

網(wǎng)頁urlstring

</param>webPageURL){經(jīng)過url獲取主機信息IPHostEntryiphe=(GetHostNameBystrUrl(webPageURL));("遠程服務器名:{0}",;經(jīng)過主機信息獲取其IPIPAddress[]address=;IPEndPointipep=newIPEndPoint(address[0],80);//實例化一個socket用于接收網(wǎng)頁數(shù)據(jù)Socketsocket=newSocket,,;//連接(ipep);if{//發(fā)送頭文件,這樣才能下載網(wǎng)頁數(shù)據(jù)((webPageURL)));}else{return;}接收頭一批數(shù)據(jù)varcount=(receiveBufferBytes);//轉(zhuǎn)變?yōu)閟tringvargetString=FileStreamfs=

//newFileStream(

創(chuàng)辦文件流@"d:\\"

,;//創(chuàng)辦緩存流BufferedStreambs=using(fs)

newBufferedStream(fs);{using

(bs){byte[]finalContent=

//(finalContent,

0,;循環(huán)經(jīng)過socket接收數(shù)據(jù)while(count>0){count=(receiveBufferBytes,,;//直接將獲獲取的(receiveBufferBytes,

byte

數(shù)據(jù)寫入當?shù)赜脖P0,;}();();();();}}}<summary>獲取header</summary>///<paramname="url">

網(wǎng)頁url</param>///<returns>privatestring

header字符串</returns>GetHeader(stringwebPageurl){return"GET"+GetRelativeUrlBystrUrl(webPageurl)+"HTTP/\r\nHost:"+GetHostNameBystrUrl(webPageurl)+"\r\nConnection:Close\r\n\r\n";}<summary>獲取相對路徑</summary>///<paramname="strUrl">網(wǎng)頁url</param><returns></returns>privatestringGetRelativeUrlBystrUrl(stringstrUrl){intiIndex=(@"http://");if(iIndex<=0)return"/";stringstrTemp=(iIndex+2);iIndex=(@"/");if(iIndex>0)return(iIndex);elsereturn"/";}<summary>依照Url獲取host</summary>///<paramname="strUrl">網(wǎng)頁url</param><returns></returns>privatestringGetHostNameBys

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論