[十二]JavaIO之BufferedInputStream BufferedOutputStream


功能簡介數組

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次數,因此說,天然可以提升性能


相關文章
相關標籤/搜索