byteBuffer, clear(), flip(), rewind(), allocate(), allocateDirect()


 【慎用allocateDirect】

http://blog.csdn.net/rocketball/article/details/5849033

http://618119.com/archives/2008/03/08/74.html

 

【不變式】

下面的不變式持有標記、位置、限制和容量值:

0 <= 標記 <= 位置 <= 限制 <= 容量
  1.  標記,mark
  2. 位置,position
  3. 限制,limit
  4. 容量,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 未定義


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM