基於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,則沒有字節可讀且返回 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);
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM