Buffer的基本用法
使用Buffer讀寫數據一般遵循以下四個步驟:
- 寫入數據到Buffer
- 調用
flip()
方法 - 從Buffer中讀取數據
- 調用
clear()
方法或者compact()
方法
當向buffer寫入數據時,buffer會記錄下寫了多少數據。一旦要讀取數據,需要通過flip()方法將Buffer從寫模式切換到讀模式。在讀模式下,可以讀取之前寫入到buffer的所有數據。
一旦讀完了所有的數據,就需要清空緩衝區,讓它可以再次被寫入。有兩種方式能清空緩衝區:調用clear()或compact()方法。clear()方法會清空整個緩衝區。compact()方法只會清除已經讀過的數據。任何未讀的數據都被移到緩衝區的起始處,新寫入的數據將放到緩衝區未讀數據的後面。
向Buffer中寫數據
寫數據到Buffer有兩種方式:
- 從Channel寫到Buffer。
- 通過Buffer的put()方法寫到Buffer裏。
從Channel寫到Buffer的例子
1 |
int bytesRead
= inChannel.read(buf); //read
into buffer. |
通過put方法寫Buffer的例子:
1 |
buf.put( 127 ); |
從Buffer中讀取數據
從Buffer中讀取數據有兩種方式:
- 從Buffer讀取數據到Channel。
- 使用get()方法從Buffer中讀取數據。
從Buffer讀取數據到Channel的例子:
1 |
//read
from buffer into channel. |
2 |
int bytesWritten
= inChannel.write(buf); |
使用get()方法從Buffer中讀取數據的例子
1 |
byte aByte
= buf.get(); |
rewind()方法
Buffer.rewind()將position設回0,所以你可以重讀Buffer中的所有數據。limit保持不變,仍然表示能從Buffer中讀取多少個元素(byte、char等)。
clear()與compact()方法
一旦讀完Buffer中的數據,需要讓Buffer準備好再次被寫入。可以通過clear()或compact()方法來完成。
如果調用的是clear()方法,position將被設回0,limit被設置成 capacity的值。換句話說,Buffer 被清空了。Buffer中的數據並未清除,只是這些標記告訴我們可以從哪裏開始往Buffer裏寫數據。
如果Buffer中有一些未讀的數據,調用clear()方法,數據將“被遺忘”,意味着不再有任何標記會告訴你哪些數據被讀過,哪些還沒有。
如果Buffer中仍有未讀的數據,且後續還需要這些數據,但是此時想要先先寫些數據,那麼使用compact()方法。
compact()方法將所有未讀的數據拷貝到Buffer起始處。然後將position設到最後一個未讀元素正後面。limit屬性依然像clear()方法一樣,設置成capacity。現在Buffer準備好寫數據了,但是不會覆蓋未讀的數據。