1. 程式人生 > >輸入流當中的read方法和readfully方法的區別與原理

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

原文連結:https://blog.csdn.net/yangjingyuan/article/details/6151234?locationNum=3

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方法提前返回了,這樣就造成了各種錯誤。