BufferedInputStream 缓冲区原理解析
BufferedInputStream是帶緩沖區(qū)的輸入流,默認(rèn)緩沖區(qū)大小是8M,能夠減少訪問(wèn)磁盤的次數(shù),提高文件讀取性能;BufferedOutputStream是帶緩沖區(qū)的輸出流,能夠提高文件的寫入效率。BufferedInputStream與BufferedOutputStream分別是FilterInputStream類和FilterOutputStream類的子類,實(shí)現(xiàn)了裝飾設(shè)計(jì)模式。
BufferedInputStream在其內(nèi)部維護(hù)一個(gè)字節(jié)數(shù)組作為緩沖區(qū),而從底層(文件)流中讀取數(shù)據(jù)的操作還是調(diào)用InputStream的方法完成。
下面通過(guò)一個(gè)例子來(lái)講解Buffered的緩沖區(qū)原理機(jī)制
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();}} }輸出的結(jié)果為:
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準(zhǔn)備
構(gòu)造一個(gè)BufferedInputStream對(duì)象,緩沖區(qū)的大小為4字節(jié)。從ByteArrayInputStream流中讀取數(shù)據(jù)“1234567890”。
變量說(shuō)明:
pos:是下一次待讀取緩沖區(qū)的坐標(biāo)
markpos:mark()標(biāo)記的緩沖區(qū)坐標(biāo)。默認(rèn)markpos=-1。
step:1
* 操作:read()*
第一次讀取數(shù)據(jù),首先初始化一個(gè)4字節(jié)大小的緩沖區(qū),然后調(diào)用內(nèi)部的fill()方法填充緩沖區(qū),填充完成后開始讀取緩沖區(qū)中的第一個(gè)元素“1”。
程序通過(guò)i++操作讀取完第一個(gè)數(shù)據(jù)后pos坐標(biāo)就會(huì)指向下一個(gè)待讀取的元素(這里指向第二個(gè)元素)。
數(shù)組坐標(biāo)是從0開始的,所以讀取完成第一個(gè)元素后,pos=1。
pos=1
step:2
操作:read()
讀出元素“2”
pos=2
step:3
操作:mark (3)
執(zhí)行mark(3)進(jìn)行標(biāo)記。這時(shí)markpos和pos坐標(biāo)相同.
markpos=2
pos=2
step:4
* 操作:read()*
讀出元素“3”
markpos=2
pos=3
step:5
* 操作:read()*
讀出元素“4”
markpos=2
pos=4
step:6
* 操作:read()*
當(dāng)讀取pos=4時(shí),超出緩沖區(qū)容量,這時(shí),需要重新再?gòu)哪繕?biāo)流中讀取元素。因?yàn)樵趕tep:3時(shí)mark標(biāo)記過(guò)元素,當(dāng)reset的時(shí)候還需要讀取(元素“3和4”)。這時(shí),需要把mark后的元素也要保留到緩沖區(qū)中,mark之前的數(shù)據(jù)丟棄(元素“1和2”)。剩下的容量讀取新元素(還可讀取兩個(gè)元素“5、和6”)。
標(biāo)記過(guò)的元素“3”的坐標(biāo)現(xiàn)在為0。所以markpos=0。
讀出元素“5”
markpos=0
pos=4
step:7
* 操作:reset()*
reset()后把pos的坐標(biāo)置為0,然后在讀取的時(shí)候又可以讀取到元素“3、4、5”
后續(xù)while循環(huán)操作
讀取元素“3”、“4”、“5”時(shí)坐標(biāo)的變化
后續(xù)while循環(huán)操作
讀取元素“6”
markpos=0
pos=4
注意:這時(shí)如果執(zhí)行reset操作,那么將可以讀取之前的4個(gè)元素(mark(3)的時(shí)候指定的是可以讀取3個(gè)元素)
后續(xù)while循環(huán)操作
緩沖區(qū)讀完后,重新再讀取一批數(shù)據(jù),因?yàn)樵摼彌_區(qū)沒(méi)有執(zhí)行mark操作,此時(shí)設(shè)置markpos=-1。
最后一次讀取
讀取元素“0”
本人簡(jiǎn)書blog地址:http://www.jianshu.com/u/1f0067e24ff8????
點(diǎn)擊這里快速進(jìn)入簡(jiǎn)書
GIT地址:http://git.oschina.net/brucekankan/
點(diǎn)擊這里快速進(jìn)入GIT
總結(jié)
以上是生活随笔為你收集整理的BufferedInputStream 缓冲区原理解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ExecutorCompletionSe
- 下一篇: 多文件同时读写为什么没有单文件读写快?