基于java的InputStream.read(byte[] b,int off,int len)算法學習 public int read(byte[] b, int off, int len) throws IOException 將輸入流中最多 len 個數(shù)據(jù)字節(jié)讀入字節(jié)數(shù)組。嘗試讀取多達 len 字節(jié),但可能讀取較少數(shù)量。以整數(shù)形式返回實際讀取的字節(jié)數(shù)。 在輸入數(shù)據(jù)可用、檢測到流的末尾或者拋出異常前,此方法一直阻塞。 如果 b 為 null,則拋出 NullPointerException。 如果 off 為負,或 len 為負,或 off+len 大于數(shù)組 b 的長度,則拋出 IndexOutOfBoundsException。 如果 len 為 0,則沒有字節(jié)可讀且返回 0;否則,要嘗試讀取至少一個字節(jié)。如果因為流位于文件末尾而沒有可用的字節(jié),則返回值 -1;否則,至少可以讀取一個字節(jié)并將其存儲在 b 中。 將讀取的第一個字節(jié)存儲在元素 b[off] 中,下一個存儲在 b[off+1] 中,依次類推。讀取的字節(jié)數(shù)最多等于 len。讓 k 為實際讀取的字節(jié)數(shù);這些字節(jié)將存儲在元素 b[off] 至 b[off+k-1] 之間,其余元素 b[off+k] 至 b[off+len-1] 不受影響。 在任何情況下,元素 b[0] 至 b[off] 和元素 b[off+len] 至 b[b.length-1] 都不會受到影響。 如果不是因為流位于文件末尾而無法讀取第一個字節(jié),則拋出 IOException。特別是,如果輸入流已關閉,則拋出 IOException。 類 InputStream 的 read(b, off, len) 方法只重復調用方法 read()。如果第一個這樣的調用導致 IOException,則從對 read(b, off, len) 方法的調用中返回該異常。如果對 read() 的任何后續(xù)調用導致 IOException,則該異常會被捕獲并將發(fā)生異常時的位置視為文件的末尾;到達該點時讀取的字節(jié)存儲在 b 中并返回發(fā)生異常之前讀取的字節(jié)數(shù)。建議讓子類提供此方法的更有效的實現(xiàn)。 參數(shù): b - 讀入數(shù)據(jù)的緩沖區(qū)。 off - 在其處寫入數(shù)據(jù)的數(shù)組 b 的初始偏移量。 len - 要讀取的最大字節(jié)數(shù)。 返回: 讀入緩沖區(qū)的總字節(jié)數(shù),如果由于已到達流末尾而不再有數(shù)據(jù),則返回 -1。 拋出: IOException - 如果發(fā)生 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); } |
|
來自: 宇宙之窗 > 《socket通信》