【慎用allocateDirect】
http://blog.csdn.net/rocketball/article/details/5849033
http://618119.com/archives/2008/03/08/74.html
【不變式】
下面的不變式持有標記、位置、限制和容量值:
0 <= 標記 <= 位置 <= 限制 <= 容量
- 標記,mark
- 位置,position
- 限制,limit
- 容量,capacity
【讀寫】
- 基本類型:
除boolean型外,char/int/short/long/float/double等,都提供了get/put方法,用於向ByteBuffer進行讀寫;
- 寫入順序:
order()獲取字節寫入順序,order(ByteOrder)可設置寫入順序;
- 相對/絕對位置:
讀寫時,可從默認位置處進行,也可指定offset與lenth。例如,put(byte[]); put(byte[], offset); put(byte[], offset, length); get與之類似。
- 視圖:
對ByteBuffer可建立基本類型視圖,char/int/short/long/float/double,asFloatBuffer(), 這樣的視圖可讀寫同類元素;
【常用操作】
.slice(),創建新的字節緩沖區,其內容是此緩沖區內容的共享子序列。新緩沖區的內容將從此緩沖區的當前位置開始。此緩沖區內容的更改在新緩沖區中是可見的,反之亦然;這兩個緩沖區的位置、界限和標記值是相互獨立的。新緩沖區的position將為零,其capacity和limit將為此緩沖區中所剩余的字節數量,其標記是不確定的。
.duplicate(), 創建共享此緩沖區內容的新的字節緩沖區。新緩沖區的內容將為此緩沖區的內容。此緩沖區內容的更改在新緩沖區中是可見的,反之亦然;這兩個緩沖區的位置、界限和標記值是相互獨立的。新緩沖區的容量、界限、位置和標記值將與此緩沖區相同。
.compact(), 將緩沖區的當前位置和界限之間的字節(如果有)復制到緩沖區的開始處。
================================================================
.mark(), 在此緩沖區的位置設置其標記。
.reset(), 將此緩沖區的位置重新設置成以前標記的位置,調用此方法既不會更改也不會丟棄標記的值。
- 緩沖區的標記是在調用reset()方法時其位置將被重置的索引。並不是總要定義標記.
- 但是,在定義標記時,永遠不要將其定義為負數,並且永遠不要大於其位置。
- 如果定義了標記,則在位置或限制調整為小於標記的值時,該標記將被丟棄。如果未定義標記,則調用reset()方法將導致拋出
InvalidMarkException
。
================================================================
.clear(),清除此緩沖區,position = 0,limit=capacity,並且丟棄標記。此方法不能實際擦除緩沖區中的數據,但從名稱來看似乎能夠擦除,因為它多數情況下確實是在擦除數據時使用的。
.flip(),反轉此緩沖區。limit=position, position=0,如果已定義了標記,則丟棄該標記。將數據從一個地方傳輸到另一個地方時,經常將此方法與 compact
方法一起使用。
.rewind(), 重繞此緩沖區,將位置設置為零並丟棄標記。
================================================================
- clear(), flip(), rewind()方法很重要,釋義如下:
ByteBuffer | 准備Buffer以實現 | Position | Limit | Mark |
.clear | 將數據read()/put()進緩沖區 | 0 | capacity | 未定義 |
.flip | 從緩沖區write()/get() | 0 | position | 未定義 |
.rewind | 從緩沖區rewrite()/get() | 0 | unchanged | 未定義 |