Java中IOUtils.copy(in,out)方法,关于缓冲byte[]buffer的问题
PHP中文网
PHP中文网 2017-04-17 12:01:20
0
2
997

内部的缓冲byte[]buffer,定义的大小为4096,如果要写的io流内容超过这个大小呢
贴个源码:

public static int copy(InputStream input, OutputStream output) throws IOException {
    long count = copyLarge(input, output);
    if (count > Integer.MAX_VALUE) {
        return -1;
    }
    return (int) count;
}

public static long copyLarge(InputStream input, OutputStream output)
        throws IOException {
    return copyLarge(input, output, new byte[DEFAULT_BUFFER_SIZE]);//大小为4096
}

public static long copyLarge(InputStream input, OutputStream output, byte[] buffer)
        throws IOException {
    long count = 0;
    int n = 0;
    while (EOF != (n = input.read(buffer))) {
        output.write(buffer, 0, n);
        count += n;
    }
    return count;
}

也没看见对buffer有什么别的处理呀?如果buffer大小不够呢?

PHP中文网
PHP中文网

认证高级PHP讲师

全部回覆(2)
左手右手慢动作

關鍵看這裡while (EOF != (n = input.read(buffer)))
文檔裡是這麼說的:

public int read(byte[] b) throws IOException

從輸入流讀取一定數量的字節,並將其儲存在緩衝區數組 b 中。以整數形式傳回實際讀取的位元組數。在輸入資料可用、偵測到檔案結尾或拋出例外前,此方法一直阻塞。
如果 b 的長度為 0,則不讀取任何位元組並返回 0;否則,請嘗試讀取至少一個位元組。如果因為流位於檔案末尾而沒有可用的位元組,則傳回值 -1;否則,至少讀取一個位元組並將其儲存在 b 中。
將讀取的第一個位元組儲存在元素 b[0] 中,下一個儲存在 b[1] 中,依次類推。 讀取的位元組數最多等於 b 的長度。 設k 為實際讀取的位元組數;這些位元組將儲存在b[0] 到b[k-1] 的元素中,不影響b[k] 到b[b.length -1] 的元素。
類別 InputStream 的 read(b) 方法的效果等同於:
read(b, 0, b.length)

是說每次最多讀4096位元組,如果多於4096位元組會由while循環讀取多次

洪涛

你覺得緩衝區應該要多大?如果你要複製一個幾百MB的文件,那麼緩衝區也要有幾百MB大小?

緩衝區就像一個推車,來往於i/o端,運送數據,作用就是減少了來往的次數,減少了開銷。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板