天天看點

基于java的InputStream.read(byte[] b,int off,int len)算法學習



public int read(byte[] b,                int off,                int len)         throws IOException      
将輸入流中最多

len

個資料位元組讀入位元組數組。嘗試讀取多達

len

位元組,但可能讀取較少數量。以整數形式傳回實際讀取的位元組數。

在輸入資料可用、檢測到流的末尾或者抛出異常前,此方法一直阻塞。

如果

b

null

,則抛出

NullPointerException

如果

off

為負,或

len

為負,或

off+len

大于數組

b

的長度,則抛出

IndexOutOfBoundsException

如果

len

為 0,則沒有位元組可讀且傳回 ;否則,要嘗試讀取至少一個位元組。如果因為流位于檔案末尾而沒有可用的位元組,則傳回值

-1

;否則,至少可以讀取一個位元組并将其存儲在

b

中。

将讀取的第一個位元組存儲在元素

b[off]

中,下一個存儲在

b[off+1]

中,依次類推。讀取的位元組數最多等于

len

。讓 k 為實際讀取的位元組數;這些位元組将存儲在元素

b[off]

b[off+

k

-1]

之間,其餘元素

b[off+

k

]

b[off+len-1]

不受影響。

在任何情況下,元素

b[0]

b[off]

和元素

b[off+len]

b[b.length-1]

都不會受到影響。

如果不是因為流位于檔案末尾而無法讀取第一個位元組,則抛出

IOException

。特别是,如果輸入流已關閉,則抛出

IOException

InputStream

read(b,

off,

len)

方法隻重複調用方法

read()

。如果第一個這樣的調用導緻

IOException

,則從對

read(b,

off,

len)

方法的調用中傳回該異常。如果對

read()

的任何後續調用導緻

IOException

,則該異常會被捕獲并将發生異常時的位置視為檔案的末尾;到達該點時讀取的位元組存儲在

b

中并傳回發生異常之前讀取的位元組數。建議讓子類提供此方法的更有效的實作。
參數:

b

- 讀入資料的緩沖區。

off

- 在其處寫入資料的數組

b

的初始偏移量。

len

- 要讀取的最大位元組數。
傳回:
讀入緩沖區的總位元組數,如果由于已到達流末尾而不再有資料,則傳回

-1

抛出:

IOException

- 如果發生 I/O 錯誤。

NullPointerException

- 如果

b

null

。