日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

BufferedInputStream 缓冲区原理解析

發(fā)布時(shí)間:2024/9/30 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BufferedInputStream 缓冲区原理解析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。