你可能不知道的一些IO流基礎

2021-09-01 18:57:52 字數 1695 閱讀 7842

輸入輸出流想必大家已經用的非常熟練了,但是,我們往往忽略了身邊最熟悉的一些東西,又或者我們只知道要這樣做,卻不知道為什麼這麼做,所以在這裡跟大家分享一下在網路程式設計當中看到的一些關於

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