Buffer表示缓冲区,用于nio中输入和输出存放和读取数据,他是一个数组,创建后就不能改变大小.

原来java.io的流操作在nio中就是对buffer操作.

*4个内部索引

---capacity,buffer的容量

int capacity()

---position,下一个要读/写的元素(从0开始),>=0 && <=limit

int position()   //回去当前position

Buffer position(int newPosition) //改变position的值,返回自身

---limit,第一个不可读/写元素,<=capacity

int limit()

Buffer limit(int newlimit)

---mark,作用是记录position,以便回退

mark()
reset()

---确定关系

0<=mark<=position<=limit<=capacity  
---剩余字节数

boolean hasRemaining()

int remaining()

*创建buffer的4个静态方法

---ByteBuffer allocateDirect(int capacity)

这是ByteBuffer唯有的特性,使用系统能直接操作IO的存储空间作为缓存区,这样免去了java的buffer和系统buffer之间的数据复制.

注意,

1.DirectBuffer没有后援数组,故调用array(),arrayOffset()会抛异常.

2.系统或JVM不一定支持DirectBuffer

3.创建和销毁DirectBuffer,消耗更多的系统资源,故适合大量和长时间的IO需求

---ByteBuffer allocate(int capacity)

---ByteBuffer wrap(byte[] array)

创建指向array的引用,array被称为后援数组.

---ByteBuffer wrap(byte[] array, int offset, int length)

*Buffer操作

---clear()

position=0,limit =capacity

---flip(),写入数据前

limit=position,position=0

---rewind(),重新读取

limit不变,position=0

---compact()

将position和limit之间的数据复制到开始处.注,复制数据非常消耗系统资源.

通过代码说明compact()

 

*buffer透视api,

含义:与原buffer共享一个后援数组,状态变量独立.见另一文章buffer view

---duplicate()

HeapByteBuffer.duplicate()示例说明

---slice(),将当前position到limit之间的空间作为新buffer的操作区域,一个切片操作

HeapByteBuffer.slice()示例说明
---asReadOnlyBuffer(),

与duplicate()功能相同,只是isReadOnly=true;

*总结

---buffer通过对外提供抽象方法,对内通过具体实现类实现的API设计方式,简洁安全的设计风格

---链式设计,代码简洁

---状态变量的设计,有创意

---慎用DirectBuffer和compact.

posted on 2011-02-25 22:28  戴忠  阅读(706)  评论(0编辑  收藏  举报