BufferedInputStream 缓冲区原理解析
BufferedInputStream是帶緩沖區的輸入流,默認緩沖區大小是8M,能夠減少訪問磁盤的次數,提高文件讀取性能;BufferedOutputStream是帶緩沖區的輸出流,能夠提高文件的寫入效率。BufferedInputStream與BufferedOutputStream分別是FilterInputStream類和FilterOutputStream類的子類,實現了裝飾設計模式。
BufferedInputStream在其內部維護一個字節數組作為緩沖區,而從底層(文件)流中讀取數據的操作還是調用InputStream的方法完成。
下面通過一個例子來講解Buffered的緩沖區原理機制
public class BufferedInputStreamDemo {public static void main(String[] args) throws Exception {try (InputStream ai = new ByteArrayInputStream("1234567890".getBytes());InputStream bis = new BufferedInputStream(ai, 4)) {System.out.println("Char : " + (char) bis.read()); //step:1System.out.println("Char : " + (char) bis.read()); //step:2bis.mark(3); //step:3System.out.println("-------mark(3)----------");System.out.println("Char : " + (char) bis.read()); //step:4System.out.println("Char : " + (char) bis.read()); //step:5System.out.println("Char : " + (char) bis.read()); //step:6bis.reset(); //step:7System.out.println("-------reset()----------");int b;while ((b = bis.read()) != -1) {System.out.println("char : " + (char) b);}} catch (Exception e) {e.printStackTrace();}} }輸出的結果為:
Char : 1 Char : 2 -------mark(3)---------- Char : 3 Char : 4 Char : 5 -------reset()---------- char : 3 char : 4 char : 5 char : 6 char : 7 char : 8 char : 9 char : 0準備
構造一個BufferedInputStream對象,緩沖區的大小為4字節。從ByteArrayInputStream流中讀取數據“1234567890”。
變量說明:
pos:是下一次待讀取緩沖區的坐標
markpos:mark()標記的緩沖區坐標。默認markpos=-1。
step:1
* 操作:read()*
第一次讀取數據,首先初始化一個4字節大小的緩沖區,然后調用內部的fill()方法填充緩沖區,填充完成后開始讀取緩沖區中的第一個元素“1”。
程序通過i++操作讀取完第一個數據后pos坐標就會指向下一個待讀取的元素(這里指向第二個元素)。
數組坐標是從0開始的,所以讀取完成第一個元素后,pos=1。
pos=1
step:2
操作:read()
讀出元素“2”
pos=2
step:3
操作:mark (3)
執行mark(3)進行標記。這時markpos和pos坐標相同.
markpos=2
pos=2
step:4
* 操作:read()*
讀出元素“3”
markpos=2
pos=3
step:5
* 操作:read()*
讀出元素“4”
markpos=2
pos=4
step:6
* 操作:read()*
當讀取pos=4時,超出緩沖區容量,這時,需要重新再從目標流中讀取元素。因為在step:3時mark標記過元素,當reset的時候還需要讀取(元素“3和4”)。這時,需要把mark后的元素也要保留到緩沖區中,mark之前的數據丟棄(元素“1和2”)。剩下的容量讀取新元素(還可讀取兩個元素“5、和6”)。
標記過的元素“3”的坐標現在為0。所以markpos=0。
讀出元素“5”
markpos=0
pos=4
step:7
* 操作:reset()*
reset()后把pos的坐標置為0,然后在讀取的時候又可以讀取到元素“3、4、5”
后續while循環操作
讀取元素“3”、“4”、“5”時坐標的變化
后續while循環操作
讀取元素“6”
markpos=0
pos=4
注意:這時如果執行reset操作,那么將可以讀取之前的4個元素(mark(3)的時候指定的是可以讀取3個元素)
后續while循環操作
緩沖區讀完后,重新再讀取一批數據,因為該緩沖區沒有執行mark操作,此時設置markpos=-1。
最后一次讀取
讀取元素“0”
本人簡書blog地址:http://www.jianshu.com/u/1f0067e24ff8????
點擊這里快速進入簡書
GIT地址:http://git.oschina.net/brucekankan/
點擊這里快速進入GIT
總結
以上是生活随笔為你收集整理的BufferedInputStream 缓冲区原理解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ExecutorCompletionSe
- 下一篇: 多文件同时读写为什么没有单文件读写快?