【慎用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 | 未定义 |