日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

詳細(xì)了解JAVA NIO之Buffer(緩沖區(qū))

瀏覽:26日期:2022-08-29 18:55:47

當(dāng)我們需要與 NIO Channel 進(jìn)行交互時(shí), 我們就需要使用到 NIO Buffer, 即數(shù)據(jù)從 Buffer讀取到 Channel 中, 并且從 Channel 中寫(xiě)入到 Buffer 中。緩沖區(qū)本質(zhì)上是一塊可以寫(xiě)入數(shù)據(jù),然后可以從中讀取數(shù)據(jù)的內(nèi)存。這塊內(nèi)存被包裝成NIO Buffer對(duì)象,并提供了一組方法,用來(lái)方便的訪問(wèn)該塊內(nèi)存。

緩沖區(qū)基礎(chǔ)

Buffer 類型有:

詳細(xì)了解JAVA NIO之Buffer(緩沖區(qū))

緩沖區(qū)是包在一個(gè)對(duì)象內(nèi)的基礎(chǔ)數(shù)據(jù)的數(shù)組,Buffer類相比一般簡(jiǎn)單數(shù)組而言其優(yōu)點(diǎn)是將數(shù)據(jù)的內(nèi)容和相關(guān)信息放在一個(gè)對(duì)象里面,這個(gè)對(duì)象提供了處理緩沖區(qū)數(shù)據(jù)的豐富的API。

所有緩沖區(qū)都有4個(gè)屬性:capacity、limit、position、mark,并遵循:capacity>=limit>=position>=mark>=0,下面是對(duì)這4個(gè)屬性的解釋:

Capacity: 容量,即可以容納的最大數(shù)據(jù)量;在緩沖區(qū)創(chuàng)建時(shí)被設(shè)定并且不能改變 Limit: 上界,緩沖區(qū)中當(dāng)前數(shù)據(jù)量 Position: 位置,下一個(gè)要被讀或?qū)懙脑氐乃饕? Mark: 標(biāo)記,調(diào)用mark()來(lái)設(shè)置mark=position,再調(diào)用reset()可以讓position恢復(fù)到標(biāo)記的位置即position=mark

我們通過(guò)一個(gè)簡(jiǎn)單的操作流程來(lái)說(shuō)明buffer的使用,下圖是新創(chuàng)建的容量為10的緩沖區(qū)邏輯視圖:

詳細(xì)了解JAVA NIO之Buffer(緩沖區(qū))

然后進(jìn)行5次調(diào)用put:

buffer.put((byte)’A’).put((byte)’B’).put((byte)’C’).put((byte)’D’).put((byte)’E’)

5次調(diào)用put之后的緩沖區(qū)為:

詳細(xì)了解JAVA NIO之Buffer(緩沖區(qū))

現(xiàn)在緩沖區(qū)滿了,我們必須將其清空。我們想把這個(gè)緩沖區(qū)傳遞給一個(gè)通道,以使內(nèi)容能被全部寫(xiě)出,但現(xiàn)在執(zhí)行g(shù)et()無(wú)疑會(huì)取出未定義的數(shù)據(jù)。我們必須將 posistion設(shè)為0,然后通道就會(huì)從正確的位置開(kāi)始讀了,但讀到哪算讀完了呢?這正是limit引入的原因,它指明緩沖區(qū)有效內(nèi)容的未端。這個(gè)操作 在緩沖區(qū)中叫做翻轉(zhuǎn):buffer.flip()。

Buffer的基本用法

使用Buffer讀寫(xiě)數(shù)據(jù)一般遵循以下四個(gè)步驟:

寫(xiě)入數(shù)據(jù)到Buffer 調(diào)用flip()方法 從Buffer中讀取數(shù)據(jù) 調(diào)用clear()方法或者compact()方法

當(dāng)向buffer寫(xiě)入數(shù)據(jù)時(shí),buffer會(huì)記錄下寫(xiě)了多少數(shù)據(jù)。

一旦要讀取數(shù)據(jù),需要通過(guò)flip()方法將Buffer從寫(xiě)模式切換到讀模式。在讀模式下,可以讀取之前寫(xiě)入到buffer的所有數(shù)據(jù)。

一旦讀完了所有的數(shù)據(jù),就需要清空緩沖區(qū),讓它可以再次被寫(xiě)入。有兩種方式能清空緩沖區(qū):調(diào)用clear()或compact()方法。clear()方法會(huì)清空整個(gè)緩沖區(qū)。compact()方法只會(huì)清除已經(jīng)讀過(guò)的數(shù)據(jù)。任何未讀的數(shù)據(jù)都被移到緩沖區(qū)的起始處,新寫(xiě)入的數(shù)據(jù)將放到緩沖區(qū)未讀數(shù)據(jù)的后面。

下面我們看一段程序來(lái)看一下Buffer的基本用法:

public static void readFile(String fileName) { RandomAccessFile aFile = null; try { //文件流 aFile = new RandomAccessFile(fileName, 'rw'); //將文件輸入到管道 FileChannel inChannel = aFile.getChannel(); //為buffer分配1024個(gè)字節(jié)大小的空間 ByteBuffer buf = ByteBuffer.allocate(1024); //將buffer中的內(nèi)容讀取到管道中 int bytesRead = inChannel.read(buf); while (bytesRead != -1) { //反轉(zhuǎn)buffer,將寫(xiě)模式改為讀模式 buf.flip(); while (buf.hasRemaining()) {//獲取buffer中的數(shù)據(jù)System.out.print((char) buf.get()); } //將上次分配的1024字節(jié)的內(nèi)容清空,為下次接收做準(zhǔn)備 buf.clear(); //管道重新讀取buffer中的內(nèi)容 bytesRead = inChannel.read(buf); } aFile.close(); } catch (Exception e) { e.printStackTrace(); } }

字節(jié)緩沖區(qū)

我們將進(jìn)一步觀察字節(jié)緩沖區(qū)。所有的基本數(shù)據(jù)類型都有相應(yīng)的緩沖區(qū)類(布爾型除外),但字節(jié)緩沖區(qū)有自己的獨(dú)特之處。字節(jié)是操作系統(tǒng)及其I/O設(shè)備使用的基本數(shù)據(jù)類型。當(dāng)在JVM和操作系統(tǒng)間傳遞數(shù)據(jù)時(shí),將其他的數(shù)據(jù)類型拆分成構(gòu)成它們的字節(jié)是十分必要的。如我們?cè)诤竺娴恼鹿?jié)中將要看到的那樣,系統(tǒng)層次的I/O面向字節(jié)的性質(zhì)可以在整個(gè)緩沖區(qū)的設(shè)計(jì)以及它們互相配合的服務(wù)中感受到。

直接緩沖區(qū)

我們知道操作系統(tǒng)是在內(nèi)存中進(jìn)行I/O操作,這些內(nèi)存區(qū)域,就操作系統(tǒng)方面而言,是相連的字節(jié)序列。于是,毫無(wú)疑問(wèn),只有字節(jié)緩沖區(qū)有資格參與I/O操作。即操作系統(tǒng)會(huì)直接存取進(jìn)程,那么我們現(xiàn)在在JVM中進(jìn)行操作,java中的內(nèi)存空間是由JVM直接進(jìn)行管理,但是在JVM中,字節(jié)數(shù)組可能不會(huì)在內(nèi)存中連續(xù)存儲(chǔ),或者無(wú)用存儲(chǔ)單元收集可能隨時(shí)對(duì)其進(jìn)行移動(dòng),這就不能保證I/O操作的目標(biāo)是連續(xù)的。

出于這一原因,引入了直接緩沖區(qū)的概念。直接緩沖區(qū)被用于與通道和固有I/O例程交互。它們通過(guò)使用固有代碼來(lái)告知操作系統(tǒng)直接釋放或填充內(nèi)存區(qū)域,對(duì)用于通道直接或原始存取的內(nèi)存區(qū)域中的字節(jié)元素的存儲(chǔ)盡了最大的努力。

直接字節(jié)緩沖區(qū)通常是I/O操作最好的選擇。在設(shè)計(jì)方面,它們支持JVM可用的最高效I/O機(jī)制。非直接字節(jié)緩沖區(qū)可以被傳遞給通道,但是這樣可能導(dǎo)致性能損耗。通常非直接緩沖不可能成為一個(gè)本地I/O操作的目標(biāo)。如果您向一個(gè)通道中傳遞一個(gè)非直接ByteBuffer對(duì)象用于寫(xiě)入,通道可能會(huì)在每次調(diào)用中隱含地進(jìn)行下面的操作:

創(chuàng)建一個(gè)臨時(shí)的直接ByteBuffer對(duì)象。 將非直接緩沖區(qū)的內(nèi)容復(fù)制到臨時(shí)緩沖中。 使用臨時(shí)緩沖區(qū)執(zhí)行低層次I/O操作。 臨時(shí)緩沖區(qū)對(duì)象離開(kāi)作用域,并最終成為被回收的無(wú)用數(shù)據(jù)。

視圖緩沖區(qū)

就像我們已經(jīng)討論的那樣,I/O基本上可以歸結(jié)成組字節(jié)數(shù)據(jù)的四處傳遞。在進(jìn)行大數(shù)據(jù)量的I/O操作時(shí),很又可能你會(huì)使用各種ByteBuffer類去讀取文件內(nèi)容,接收來(lái)自網(wǎng)絡(luò)連接的數(shù)據(jù),等等。一旦數(shù)據(jù)到達(dá)了你的ByteBuffer,您就需要查看它以決定怎么做或者在將它發(fā)送出去之前對(duì)它進(jìn)行一些操作。ByteBuffer類提供了豐富的API來(lái)創(chuàng)建視圖緩沖區(qū)。

視圖緩沖區(qū)通過(guò)已存在的緩沖區(qū)對(duì)象實(shí)例的工廠方法來(lái)創(chuàng)建。這種視圖對(duì)象維護(hù)它自己的屬性,容量,位置,上界和標(biāo)記,但是和原來(lái)的緩沖區(qū)共享數(shù)據(jù)元素。但是ByteBuffer類允許創(chuàng)建視圖來(lái)將byte型緩沖區(qū)字節(jié)數(shù)據(jù)映射為其它的原始數(shù)據(jù)類型。例如,asLongBuffer()函數(shù)創(chuàng)建一個(gè)將八個(gè)字節(jié)型數(shù)據(jù)當(dāng)成一個(gè)long型數(shù)據(jù)來(lái)存取的視圖緩沖區(qū)。

但是使用視圖緩沖區(qū)的話,一旦ByteBuffer對(duì)于視圖的維護(hù)對(duì)象產(chǎn)生非常規(guī)行的使用,那么對(duì)于工廠方法創(chuàng)建的緩沖區(qū)而言,asLongBuffer()函數(shù)就不在使用這個(gè)視窗,那么這個(gè)8字節(jié)的數(shù)據(jù)當(dāng)成一個(gè)long類型的數(shù)據(jù)類型來(lái)存取的數(shù)據(jù)視圖。

以上就是詳細(xì)了解JAVA NIO之Buffer(緩沖區(qū))的詳細(xì)內(nèi)容,更多關(guān)于JAVA NIO buffer(緩沖區(qū))的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品中文字幕亚洲欧美| 91亚洲自偷观看高清| 日本综合字幕| 国产精品久久777777毛茸茸| 91精品一区| 91精品啪在线观看国产爱臀| 日本午夜精品视频在线观看| 国产欧美日韩在线一区二区| 欧美视频一区| 国产精品玖玖玖在线资源| 国产精品久久久久9999高清| 精品国产中文字幕第一页| 欧美1区2区3| 首页国产精品| 欧美日韩亚洲在线观看| 国产精品日韩欧美一区| 亚洲精品免费观看| 国产精品草草| 国产精品伦理久久久久久| 色婷婷精品视频| 91午夜精品| 日本久久黄色| 99riav国产精品| 欧美va天堂| 日韩国产一二三区| 久久精品国产大片免费观看| 亚洲精品视频一二三区| 国产 日韩 欧美 综合 一区| 日韩欧美中文字幕在线视频| 中文一区在线| 另类小说一区二区三区| 一区二区三区四区日本视频| 欧美日韩国产亚洲一区| 欧美专区一区二区三区| 日韩国产在线一| 日韩av自拍| 尤物在线精品| 国产另类在线| 久久精品青草| 日韩成人av影视| 日韩啪啪电影网| 香蕉久久国产| 老色鬼精品视频在线观看播放| 久久国产影院| 日本强好片久久久久久aaa| 中文一区一区三区高中清不卡免费| 1000部精品久久久久久久久| 午夜亚洲福利| 国产欧美一区二区三区精品酒店| 在线一区免费观看| 国产精品亚洲综合久久| 亚洲先锋成人| 国产精品a级| 国产亚洲一区二区手机在线观看| 免费久久精品视频| 国产a久久精品一区二区三区| 国产视频久久| 精品伊人久久久| 免费观看日韩电影| www.com.cn成人| 日韩一区二区三区四区五区| 国产一区二区三区四区| 免费国产自线拍一欧美视频| 国产精品久久久一区二区| 99成人超碰| 久久精品xxxxx| 午夜久久tv| 国产亚洲毛片在线| 亚洲精品一级| 日本不卡在线视频| 午夜欧美精品| 蜜桃传媒麻豆第一区在线观看 | 亚洲欧美日韩一区在线观看| 日韩精品一区二区三区免费观看| 久久精品午夜| 亚洲综合精品| 欧美激情aⅴ一区二区三区 | 黄色在线网站噜噜噜| 亚洲另类视频| 久久视频国产| 精品国产午夜肉伦伦影院| 亚洲九九精品| 免费观看久久av| 国产白浆在线免费观看| 欧美日韩伊人| 中文精品电影| 亚洲国产日韩欧美在线| 都市激情国产精品| 91亚洲无吗| 性色一区二区| 欧美三级精品| 欧美精品99| 日本三级亚洲精品| 综合激情婷婷| 图片区亚洲欧美小说区| 国产精品国产三级国产在线观看| 日本强好片久久久久久aaa| 国产亚洲精品久久久久婷婷瑜伽| 在线人成日本视频| 精品久久免费| 欧美黄色一区二区| 91精品国产自产精品男人的天堂| 欧美在线综合| 国产麻豆综合| 国产高清一区| 日韩国产欧美| 神马午夜在线视频| 不卡专区在线| 精品成av人一区二区三区 | 精品美女视频 | 久久激五月天综合精品| 亚洲人亚洲人色久| 久久亚洲欧洲| 最新亚洲一区| 欧美1区免费| 国产精品久久久久毛片大屁完整版| 国产精品videossex久久发布| 久久久久久久久久久妇女| 久久精品国产99| 视频在线在亚洲| 国产农村妇女精品一二区| 视频二区不卡| 99精品电影| 亚洲不卡av不卡一区二区| 欧洲精品一区二区三区| 午夜在线一区二区| 免费人成在线不卡| 亚洲在线免费| 亚洲一区区二区| 视频一区国产视频| 黄色亚洲大片免费在线观看| 亚洲成人一区| 久久午夜精品| 亚洲一级大片| 欧美精品国产一区| 久久不见久久见免费视频7| 国产亚洲久久| 麻豆国产欧美一区二区三区| 风间由美中文字幕在线看视频国产欧美| 精品一区二区三区中文字幕在线| 捆绑调教美女网站视频一区| 樱桃视频成人在线观看| 久久久777| 欧美日韩国产综合网| 一区二区三区国产在线| 日韩中文字幕| 欧美激情视频一区二区三区在线播放| 国产一区精品福利| 久久要要av| 亚洲天堂av资源在线观看| 欧美午夜三级| 精品视频自拍| 亚洲成人二区| 免费看黄色91| 欧美精品1区| 久久免费国产| 亚洲ww精品| 久久香蕉网站| 国产一在线精品一区在线观看| 在线精品亚洲| 日本在线视频一区二区| 韩日一区二区| 亚洲国产不卡| 欧美在线91| 久久国产中文字幕| 亚洲精品无吗| 久久中文精品| 亚洲精品一二三**| 久久狠狠久久| 国产激情在线播放| 99成人在线| 欧美精品导航| 99日韩精品| 久久的色偷偷| 麻豆成人91精品二区三区| 午夜久久tv| 亚洲+小说+欧美+激情+另类| 精品一级视频| 在线观看一区| 一级成人国产| 欧美日韩网址| 国产精品密蕾丝视频下载| 国产精品欧美一区二区三区不卡| 18国产精品| 精品久久免费| 久久青青视频| 日韩成人综合| 婷婷久久免费视频| 精品国产亚洲一区二区三区| 午夜欧美精品| 国产欧美日韩| 999国产精品视频| 国产精品一国产精品k频道56| 在线成人直播| 福利欧美精品在线| 亚洲精品美女| 不卡在线一区二区| 日韩av二区| 欧美精品国产一区| 99在线观看免费视频精品观看|