Java NIO ByteBuffer概述

Buffer的基本用法

使用Buffer讀寫數據一般遵循以下四個步驟:
1穴张、分配空間
2撬统、寫入數據到Buffer
3、調用flip()方法
4铝穷、從Buffer中讀取數據
5钠怯、調用clear()方法或者compact()方法
當向buffer寫入數據時,buffer會記錄下寫了多少數據曙聂。一旦要讀取數據晦炊,需要通過flip()方法將Buffer從寫模式切換到讀模式。在讀模式下筹陵,可以讀取之前寫入到buffer的所有數據刽锤。
一旦讀完了所有的數據,就需要清空緩沖區(qū)朦佩,讓它可以再次被寫入并思。有兩種方式能清空緩沖區(qū):調用clear()或compact()方法。clear()方法會清空整個緩沖區(qū)语稠。compact()方法只會清除已經讀過的數據宋彼。任何未讀的數據都被移到緩沖區(qū)的起始處弄砍,新寫入的數據將放到緩沖區(qū)未讀數據的后面。

Buffer-process.jpeg

四個主要屬性:

  • capacity:作為一個內存塊输涕,Buffer有一個固定的大小值音婶,也叫“capacity”.你只能往里寫capacity個byte、long莱坎,char等類型衣式。一旦Buffer滿了,需要將其清空(通過讀數據或者清除數據)才能繼續(xù)寫數據往里寫數據檐什。
  • position:
    • 當你寫數據到Buffer中時碴卧,position表示當前的位置。初始的position值為0.當一個byte乃正、long等數據寫到Buffer后住册, position會向前移動到下一個可插入數據的Buffer單元。position最大可為capacity – 1瓮具。
    • 當讀取數據時荧飞,也是從某個特定位置讀。當將Buffer從寫模式切換到讀模式名党,position會被重置為0叹阔。 當從Buffer的position處讀取數據時,position向前移動到下一個可讀的位置兑巾。
  • limit:
    • 在寫模式下条获,Buffer的limit表示你最多能往Buffer里寫多少數據忠荞。 寫模式下蒋歌,limit等于Buffer的capacity。
    • 當切換Buffer到讀模式時委煤, limit表示你最多能讀到多少數據堂油。因此,當切換Buffer到讀模式時碧绞,limit會被設置成寫模式下的position值府框。換句話說,你能讀到之前寫入的所有數據(limit被設置成已寫數據的數量讥邻,這個值在寫模式下就是position)
  • mark:為某一讀過的位置做標記迫靖,便于某些時候回退到該位置。

Buffer基本函數

Buffer的分配

ByteBuffer buf = ByteBuffer.allocate(48);

向Buffer中寫數據

從Channel寫到Buffer的例子

int bytesRead = inChannel.read(buf); //read into buffer.

通過put方法寫B(tài)uffer

buf.put(127);

從Buffer中讀取數據

從Buffer讀取數據到Channel的例子:

//read from buffer into channel.
int bytesWritten = inChannel.write(buf);

使用get()方法從Buffer中讀取數據的例子

byte aByte = buf.get();

flip()方法

flip方法將Buffer從寫模式切換到讀模式兴使。調用flip()方法會將position設回0系宜,并將limit設置成之前position的值。
換句話說发魄,position現在用于標記讀的位置盹牧,limit表示之前寫進了多少個byte俩垃、char等 —— 現在能讀取多少個byte、char等汰寓。

clear()與compact()方法

一旦讀完Buffer中的數據口柳,需要讓Buffer準備好再次被寫入∮谢可以通過clear()或compact()方法來完成跃闹。
如果調用的是clear()方法,position將被設回0毛好,limit被設置成 capacity的值辣卒。換句話說,Buffer 被清空了睛榄。Buffer中的數據并未清除荣茫,只是這些標記告訴我們可以從哪里開始往Buffer里寫數據。
如果Buffer中有一些未讀的數據场靴,調用clear()方法啡莉,數據將“被遺忘”,意味著不再有任何標記會告訴你哪些數據被讀過旨剥,哪些還沒有咧欣。
如果Buffer中仍有未讀的數據,且后續(xù)還需要這些數據轨帜,但是此時想要先先寫些數據魄咕,那么使用compact()方法。
compact()方法將所有未讀的數據拷貝到Buffer起始處蚌父。然后將position設到最后一個未讀元素正后面哮兰。limit屬性依然像clear()方法一樣,設置成capacity」冻冢現在Buffer準備好寫數據了喝滞,但是不會覆蓋未讀的數據。

圖解ByteBuffer函數過程

put

Writes the given byte into this buffer at the current position, and then increments the position.
寫模式下膏秫,往buffer里寫一個字節(jié)右遭,并把postion移動一位。寫模式下缤削,一般limit與capacity相等窘哈。


Buffer-put.png

flip

Flips this buffer. The limit is set to the current position and then the position is set to zero. If the mark is defined then it is discarded.
After a sequence of channel-read or put operations, invoke this method to prepare for a sequence of channel-write or relative get operations.(即讀寫模型切換)
寫完數據,需要開始讀的時候亭敢,將postion復位到0滚婉,并將limit設為當前postion

public final Buffer flip() {
        limit = position;
        position = 0;
        mark = -1;
        return this;
 }
Buffer-flip.png

get

Reads the byte at this buffer's current position, and then increments the position.
從buffer里讀一個字節(jié),并把postion移動一位吨拗。上限是limit满哪,即寫入數據的最后位置


Buffer-get.png

clear

Clears this buffer. The position is set to zero, the limit is set to the capacity, and the mark is discarded.
Invoke this method before using a sequence of channel-read or put operations to fill this buffer.
將position置為0婿斥,并不清除buffer內容。

    public final Buffer clear() {
        position = 0;
        limit = capacity;
        mark = -1;
        return this;
    }
Buffer-clear.png

參考:
http://ifeve.com/buffers/
博客:
http://yany8060.xyz/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末哨鸭,一起剝皮案震驚了整個濱河市民宿,隨后出現的幾起案子,更是在濱河造成了極大的恐慌像鸡,老刑警劉巖活鹰,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異只估,居然都是意外死亡志群,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門蛔钙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锌云,“玉大人,你說我怎么就攤上這事吁脱∩O眩” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵兼贡,是天一觀的道長攻冷。 經常有香客問我,道長遍希,這世上最難降的妖魔是什么等曼? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮凿蒜,結果婚禮上禁谦,老公的妹妹穿的比我還像新娘。我一直安慰自己篙程,他們只是感情好枷畏,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布别厘。 她就那樣靜靜地躺著虱饿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪触趴。 梳的紋絲不亂的頭發(fā)上氮发,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音冗懦,去河邊找鬼爽冕。 笑死,一個胖子當著我的面吹牛披蕉,可吹牛的內容都是我干的颈畸。 我是一名探鬼主播乌奇,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼眯娱!你這毒婦竟也來了礁苗?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤徙缴,失蹤者是張志新(化名)和其女友劉穎试伙,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體于样,經...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡疏叨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了穿剖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚤蔓。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖糊余,靈堂內的尸體忽然破棺而出昌粤,到底是詐尸還是另有隱情,我是刑警寧澤啄刹,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布涮坐,位于F島的核電站,受9級特大地震影響誓军,放射性物質發(fā)生泄漏袱讹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一昵时、第九天 我趴在偏房一處隱蔽的房頂上張望捷雕。 院中可真熱鬧,春花似錦壹甥、人聲如沸救巷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浦译。三九已至,卻和暖如春溯职,著一層夾襖步出監(jiān)牢的瞬間精盅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工谜酒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留叹俏,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓僻族,卻偏偏與公主長得像粘驰,于是被迫代替她去往敵國和親屡谐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內容

  • Java NIO(New IO)是從Java 1.4版本開始引入的一個新的IO API蝌数,可以替代標準的Java I...
    JackChen1024閱讀 7,555評論 1 143
  • Java NIO中的Buffer用于和NIO通道進行交互康嘉。如你所知,數據是從通道讀入緩沖區(qū)籽前,從緩沖區(qū)寫入到通道中的...
    AFinalStone閱讀 277評論 0 0
  • 前篇 我一直猜想亭珍,除了周圍纏繞著我們的生活,是不是還有另一個世界呢枝哄。
    洪濤閱讀 242評論 0 0
  • 看到了這條信息肄梨,我很無奈,不知道怎么回答挠锥,因為一個回答對她來說沒有什么幫助的众羡,接下來還會有無窮的問題 難道我們在生...
    樂活雅閱讀 3,605評論 0 1
  • 今天,心情頗有些不平靜蓖租,些許惆悵粱侣,夾雜著憂傷。 也許這才是真實面具下的自己吧蓖宦,卸去了偽裝齐婴,有的只是無盡的孤獨與...
    淺淺微笑的時光閱讀 180評論 2 1