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;
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZFUDGdrN-1628528570409)(image\BufferInit.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/1b0c106db49061517c3f885119ecb0f3.png)
put()写入
每放一个元素,position后移一位
charBuffer.put("Hello,World".toCharArray());
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-02BfXBmQ-1628528570411)(image\BufferPut.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/4f4206746cc01c183e42a2ea2efa0f1d.png)
flip(),切换为读就绪状态
charBuffer.flip();
limit切到position位置,position切到首位
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ut3rLIsN-1628528570411)(image\BufferFlip.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/745f7713137cf1a47db9c17900834481.png)
get()读取
每读取一次元素,positio后移一位
charBuffer.get();//循环调用5次,读取"Hello"
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Di0AY3Od-1628528570413)(image\BufferGet.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/decc55694959089a59ebf73e2547c4d3.png)
Mark()标记,reset()恢复标记位
mark()将mark置于position位置,reset()重新将position恢复到mark位置
charBuffer.mark()
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8lwzcUmI-1628528570414)(image\BufferMark.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/0b6b9eae4d8bbdd150987814bd05ae51.png)
367

被折叠的 条评论
为什么被折叠?



