Buffer(以ByteBuffer为例)
简介
Buffer
是一个线性有序集合,主要有三个标识:capacity
, limit
, position
**capacity
**就是Buffer的容量,不为负且不改变
**limit
**标识第一个不能读/写的元素索引,不为负且不大于capacity
**position
**标识下一个要被读/写的元素索引不为负且不大于limit
**mark
**当reset的时候回到标记的position的位置,不为负且不大于position
0 <= mark <= position <= limit <= capacity
对于每个非boolean
的基础类型,都实现了一个Buffer子类,重写了get
跟put
方法,并且可以被对应的channel
操作
每个Buffer
都实现了readable
但不一定实现了writable
,并且是线程不安全的,对于并发多线程访问,应该实现同步控制
主要的三个方法:clear
, flip
, rewind
源码真的很简单,这里只搞懂怎么实现的图示就OK
初始化
mark的默认值是-1,初始化主要检查0 <= mark <= position <= limit <= capacity关系
private int mark = -1;
private int position = 0;
private int limit;
private int capacity;
Buffer(int mark, int pos, int lim, int cap) { // package-private
if (cap < 0)
throw new IllegalArgumentException("Negative capacity: " + cap);
this.capacity = cap;
limit(lim);
position(pos);
if (mark >= 0) {
if (mark > pos)
throw new IllegalArgumentException("mark > position: ("
+ mark + " > " + pos + ")");
this.mark = mark;
}
}
示例:
CharBuffer charBuffer = CharBuffer.allocate(16);
allocate 方法调用了HeapCharBuffer,默认mark=-1,position=0,limit=capacity;
put()写入
每放一个元素,position后移一位
charBuffer.put("Hello,World".toCharArray());
flip(),切换为读就绪状态
charBuffer.flip();
limit切到position位置,position切到首位
get()读取
每读取一次元素,positio后移一位
charBuffer.get();//循环调用5次,读取"Hello"
Mark()标记,reset()恢复标记位
mark()将mark置于position位置,reset()重新将position恢复到mark位置
charBuffer.mark()