轉載請標明出處
作者的話
最近有同學問我Java網(wǎng)絡編程方面的知識仆嗦,我就總結了一篇關于網(wǎng)絡知識由初級到中級的學習過程。其中這本書是非常有閱讀學習的價值脸侥。我下載了電子版的中文翻譯版蒙兰,英文的也能看懂,但對于現(xiàn)在的我效率慢的多敏晤,大概是英文詞匯量不夠足的原因。接下來就把學習此書的過程中遇到的知識點都一一記錄下來缅茉,回頭溫習或者研磨這一塊兒時不必從頭開始嘴脾。好腦子不如爛筆頭嘛~(次文會不斷更新)
JavaI/O 中 OutputStream 是一切輸出流的抽象超類.
BufferedOutputStream 和 BufferedWriter 代表帶有緩沖區(qū). 緩存區(qū)會把接收到的數(shù)據(jù)暫時存在內(nèi)存中,當達到一定數(shù)量的字節(jié)后,flushBuffer 刷新緩沖區(qū)译打,讓數(shù)據(jù)一次性的寫入存儲介質耗拓,好處是提高效率。
問什么要刷新緩沖區(qū) (flush buffer)假設緩沖區(qū)設置成1024字節(jié)奏司,那這個流在發(fā)送緩沖區(qū)數(shù)據(jù)之前要等待更多數(shù)據(jù)的到來乔询。在服務器響應未到來之前,不會接收到更多數(shù)據(jù)韵洋,但是服務器響應也永遠不會到來竿刁,因為請求未發(fā)送!所以會出現(xiàn)2個問題搪缨。1.死鎖狀態(tài) ?2.數(shù)據(jù)丟失 來看圖
所以食拜,這是我們寫數(shù)據(jù)時有必要在流關閉之前調用flush()的原因。即使你保證不會出現(xiàn)這兩種問題勉吻,但依舊建議你去調用低成本的flush()
當結束一個流的操作時监婶,調用close() 會釋放掉與這個流相關聯(lián)的資源,比如文件句柄或者端口齿桃。如果流來自于網(wǎng)絡則會關閉這次鏈接。如果未關閉流煮盼,會導致泄漏文件句柄短纵,網(wǎng)絡端口或其他資源。所以為了確保流能夠被關閉僵控,一般我們放在finally中做處理香到。為了變量作用域,所以在try之外聲明报破,在之內(nèi)初始化悠就,為了不發(fā)生NullPointerException在關閉流之前,進行非Null判斷充易。關閉時若出現(xiàn)異常梗脾,一般不做處理,最多用日志記錄下來盹靴。 ----- 這個技術叫做 ?釋放模式 該技術也常用在socket炸茧,通道,JDBC等中稿静。
Java7中引用了 try-with-resource可以更加簡潔的完成這個過程梭冠,如