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 未定义
原文地址:https://www.cnblogs.com/alipayhutu/p/2491732.html