輸入輸出流想必大家已經用的非常熟練了,但是,我們往往忽略了身邊最熟悉的一些東西,又或者我們只知道要這樣做,卻不知道為什麼這麼做,所以在這裡跟大家分享一下在網路程式設計當中看到的一些關於
i/o流的細節,閒話不多說,下面開始:
outputstream,
顧名思義:輸出流,它的子類使用所提供的方法向某種**寫入資料,例如,
fileoutputstream
將資料寫入檔案,
telnetoutputstream
將資料寫入網路連線,不過聽到這大家會問了,
api中不存在
telnetoutputstream
這個類呀,不過想必大家都記得,
sokcet
類中有乙個
getoutputstream
的方法,這個方法是獲得連線物件的輸出流,返回的是
outputstream,
其本質更徹底的說應該是網路輸出流,這是多型的威力,如果你知道怎麼使用這些超類,你也就知道怎麼使用所有這些子類。
outputstream
中最基本的方法無疑就是
write(int b)
了,這裡雖然傳入了乙個
int,但只接收
0-255
範圍之內的整數,大家在
dataoutputstream
中想必還看到過乙個
writebyte
(int v
)的方法,這個方法確保了乙個
byte
以乙個byte
的形式寫入資料,並且將資料追加到了緩衝區中。
說到緩衝區就不得不提乙個
flush
方法,想必大家也都用過它,我們知道在
outputstream
呼叫write
方法的時候往往需要呼叫乙個
flush
方法,簡單的說是為了重新整理緩衝區,強制輸出資料,但是為什麼要強制輸出呢?舉乙個這樣的例子:假設一台伺服器與一台客戶機之間正在進行通訊,這個時候伺服器在等待客戶機的訊息,如果客戶機傳送了
300個位元組的請求,但是預設緩衝區的大小是
1024
個位元組,那麼這個流的緩衝區就會等待更多的資料到來,而客戶機以為自己的資料已經發出去了,自然會等待著伺服器的響應,結果伺服器那邊由於緩衝區還沒滿,所以資料遲遲沒有來到,結果就形成了一種死鎖狀態。所以我們經常會呼叫
flush
方法,不管你是否認為有必要重新整理緩衝區,這都是很重要的,取決於你如何控制流的引用,你可能知道流被緩衝,也可能不知道(例如,不管你是否希望,
system.out
都是緩衝的
),flush
相對程式出錯而言是乙個低成本的操作,所以在需要重新整理輸出的時候不要忘了寫上哦。
inputstream
,輸入流,其本質與輸出流剛好形成對立的關係,用來從**中讀取資料,最基本的方法是沒有引數的
read()
方法,這個方法從輸入流的源中讀取乙個位元組資料,作為乙個0到
255的
int返回,流的結束由返回
-1結束,
read()
方法會等待並阻塞其後的任何**的執行,知道有乙個位元組的資料可用。但是我們在寫通訊的時候卻往往不能用
-1表示資料的結束,因為我們永遠不知道對方會在什麼情況下真正結束通訊,就像關閉連線一樣,另外一方得告訴你什麼在什麼情況下他這句話已經說完了,這就涉及到通訊協議了,下次再跟大家具體分析一下。
你可能不知道的東西
元素可以分為塊級元素,行內元素以及行內塊級元素。行內元素的margin或者padding只有margin left和margin right以及padding left和padding right有效果,margin top margin bottom padding top padding bot...
你可能不知道的const
眾所周知,使用 const 宣告的變數必須同時初始化為某個值。一經宣告,在其生命週期的任何時候都不能再重新賦予新值 const a syntaxerror 常量宣告時沒有初始化 const b 3 console.log b 3 b 4 typeerror 給常量賦值const 宣告只應用到頂級原語...
你可能不知道的python logging機制
先來看幾個例子,先想一下執行結果,答案稍後揭曉 例一 mylogger logging.getlogger mylogger mylogger.info mylogger info mylogger.warning mylogger warning 例二 mylogger logging.getlo...