功能簡介數組
BufferedInputStream 和 BufferedOutputStream同樣,他們都是過濾流緩存
裝飾器模式下具體的裝飾類性能
用來裝飾InputStream以及OutputStream下的其餘的具體的實現類測試
好比FileInputStreamspa
BufferedInputStream 和 BufferedOutputStream對象 都是在內部藉助於字節數組,來實現緩存的索引 |
BufferedInputStreamip
BufferedInputStreamci |
內部使用字節數組對輸入流進行緩存資源 |
protected volatile byte buf[]; |
內部的字節數組 可能動態增加,動態增加是藉助於建立新數組而後複製,從新指向 |
DEFAULT_BUFFER_SIZE |
默認大小8K 8192 |
private static int MAX_BUFFER_SIZE = Integer.MAX_VALUE - 8; |
緩衝區最大容許大小 |
protected int count; |
有效字節的個數 |
protected int pos; |
buf 數組中讀取的下一個字符的下標索引 |
protected int markpos = -1; |
最後一次調用 mark 方法時 pos 字段的值 |
protected int marklimit; |
調用 mark 方法後,在後續調用 reset 方法失敗以前所容許的最大提早讀取量 就是最多支持的個數 |
buf[]; 用於實際存儲字節數組的值 DEFAULT_BUFFER_SIZE 表示默認緩衝區的大小 MAX_BUFFER_SIZE 表示 最大支持的緩衝區大小 這三個字段用於存儲緩衝 |
pos 用於記錄讀取位置 |
markpos / marklimit mark功能使用 |
構造方法
說了不少遍的裝飾器模式, 是你還有你 他的使用,必然離不開 InputStream,並且,它內部還會維護一個 InputStream 看下構造方法,若是不指定大小,那麼將會使用默認大小 若是指定了大小,只要合法,將會建立字節數組 並且,會調用父類的構造方法,父類FilterInputStream中 in是protected的 |
read方法
提供了兩個版本的read public int read() public int read(byte[] b,int off, int len) 多參數的read方法將會持續讀取儘量多的數據,直到: 已經讀取了指定的字節數, 底層流的 read 方法返回 -1,指示文件末尾(end-of-file),或者 底層流的 available 方法返回 0,指示將阻塞後續的輸入請求 |
skip /available/mark/reset/markSupported 同InputStream的協議語義 跳過指定個數 獲取可用個數 作標記 回到標記點 測試是否支持mark 和reset方法 |
close
雖然並非直接打開資源,可是它涉及到內部的InputStream,因此須要cloase |
BufferedOutputStream
BufferedOutputStream內部也是經過字節數組進行緩存的 count 記錄有效字節數 |
構造方法也能夠設置,初始化大小 若是不設置,默認是8192 |
BufferedOutputStream 內部經過字節數組進行緩存 也就是數據不直接寫入磁盤 而是先寫入到內部緩衝區中 因此說,flush 方法是必須的,用來執行實際寫入的操做 它的內部藉助於flushBuffer方法 方法實現很簡單,只要有有效字節,就把有效字節經過內部的out對象寫入,而後count清0 清零了就能夠繼續從頭寫了 |
write方法
單參數write 一旦緩衝區滿了 直接所有調用底層out寫入 而且重頭開始緩存 |
三參數write 將數組b 從off偏移量開始,寫入len長度到流中 若是len大於緩衝區長度 將全部數據寫入,刷新緩衝區 而且直接調用底層out的write 也就是不緩衝了 若是len長度沒有超過緩衝區大小 但是 內部緩衝區空間不足夠了 刷新緩衝區 最後將參數字節數組的數據, 拷貝到緩衝區 |
總結
既然是緩衝裝飾器流
因此,它內部要維護一個InputStream或者OutputStream
另外,既然提供了緩衝的功能,經常使用的緩衝功能天然是數組的形式
對於他們兩個就是字節數組
他們內部就是都維護了一個字節數組
BufferedInputStream 會將內部底層的流讀取的數據,存入到他的緩衝區中,經過BufferedInputStream提供讀取功能
BufferedOutputStream 會將寫入的數據,存入到他的緩衝區中,在須要的時候,在藉助於內部底層的流進行真正寫入
緩衝的功能,減小了跟底層磁盤直接交互的io次數,因此說,天然可以提升性能