输入流中的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方法提前返回了,這樣就造成了各種錯誤。
給你看些代碼!你就明白是怎么回事了!其實內部有進行判斷,但是并沒有進行處理!
而是直接拋出了異常!一下是JDK 的源代碼:
public void readFully(byte[] b, int off, int len, boolean copy)throws IOException{while (len > 0) {int n = read(b, off, len, copy);if (n < 0) {throw new EOFException();}off += n;len -= n;}}
從這里不難看出!這里對異常并沒有處理!而是直接拋出異常!
這里還要注意的一個問題就是其實 readFully和read的區別。
readFully方法并不是說一下就把整個文件讀完了,不用去管是否到達文件末尾的異常。
readFully只是在讀取數據的時候,會一直把緩沖區讀滿,否則一直處于阻塞狀態而等待讀取。
而read方法只是將字節流中的數據讀完。那么數據在TCP協議傳送的過程中,可能輸入流接受到的數據并不完全,只是其中的一部分。而如果這時候的緩沖區沒有滿的話,readFully將會繼續等待。知道緩沖區裝滿。
某些時候!你可能需要讀出特定的長度的字段。比如一些數據的頭信息之類的!
這時候如果你用read去讀,那么可能還沒有讀完就個你返回來了。
但是如果去用readFully讀,那么就會完整的給你讀出來。
但是在更多的時候,如果不是確定要用特定長度的數據。還是用read去讀。
用readFully有點危險。
總結
以上是生活随笔為你收集整理的输入流中的read和readfully方法区别和原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IO流类之间关系图
- 下一篇: MySql 的一些使用小技巧