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ū)未讀數據的后面。
四個主要屬性:
- 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相等窘哈。
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;
}
get
Reads the byte at this buffer's current position, and then increments the position.
從buffer里讀一個字節(jié),并把postion移動一位吨拗。上限是limit满哪,即寫入數據的最后位置
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;
}