輸入流當中的read方法和readfully方法的區別與原理

DataInputStream類中的read(byte[] b)和readFully(byte[] b)讀取消息到底有什麼區別呢?

下面讓我來分析一下:

 

             1.其實read(byte[] b)方法和readFully(byte []b)都是利用InputStream中read()

方法,每次讀取的也是一個字節,只是讀取字節數組的方式不同,查詢jdk中源代碼發現

 

 

             2. read(byte[] b)方法實質是讀取流上的字節直到流上沒有字節爲止,如果當聲明的字節數組長度大於流上的數據長度時就提前返回,而readFully(byte[] b)方法是讀取流上指定長度的字節數組,也就是說如果聲明瞭長度爲len的字節數組,readFully(byte[] b)方法只有讀取len長度個字節的時候才返回,否則阻塞等待,如果超時,則會拋出異常 EOFException。

            

              3.那麼當發送了長度爲len的字節,那麼爲什麼用read方法用戶收不全呢,揪其原因我們發現消息在網絡中傳輸是沒那麼理想的,我們發的那部分字節數組在傳送過程中可能在接受信息方的緩存當中或者在傳輸線路,極端情況下可能在發送方的緩存當中,這樣就不在流上,所以read方法提前返回了,這樣就造成了各種錯誤。

發佈了108 篇原創文章 · 獲贊 7 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章