public int read(byte[] b, int off, int len) throws IOException
-
將輸入流中最多
len
個數據字節讀入字節數組。嘗試讀取多達len
字節,但可能讀取較少數量。以整數形式返回實際讀取的字節數。在輸入數據可用、檢測到流的末尾或者拋出異常前,此方法一直阻塞。
如果
b
為null
,則拋出NullPointerException
。如果
off
為負,或len
為負,或off+len
大於數組b
的長度,則拋出IndexOutOfBoundsException
。如果
len
為 0,則沒有字節可讀且返回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
。
read是一個很好的讀取器,對流,如應用於下載中是一個不錯的算法!例子:
public static final int INITIAL_SIZE = 100000;
private byte buffer[] = new byte[INITIAL_SIZE];
private int index = 0;
private int capacity() {
return (buffer.length - index);
}
public void read(InputStream in, int max) throws IOException {
long k= 0;
do {
int size;
// only read up to the max size, if the max size was
// specified
if (max != -1) {
size = Math.min(capacity(), max);
} else {
size = capacity();
}
// actually read the block
k= in.read(buffer, index, capacity());
// quit if we hit EOF
if (k< 0) {
break;
}
// adjust capacity if needed
index += k;
if (capacity() < 10) {
expand();
}
// see if we hit the max length
if (max != -1) {
max -= l;
if (max <= 0) {
break;
}
}
} while (k!= 0);
}