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);
}
