Buffer(以ByteBuffer为例)
文章目录
- Buffer(以ByteBuffer为例)
- 简介
- 初始化
- put()写入
- flip(),切换为读就绪状态
- get()读取
- Mark()标记,reset()恢复标记位
简介
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)(imageBufferInit.jpg)]](https://file2.kaopuke.com:8081/files_image/2023062822/183b3d1e42624993a27495e188371d65.jpg)
put()写入
每放一个元素,position后移一位
charBuffer.put("Hello,World".toCharArray());
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-02BfXBmQ-1628528570411)(imageBufferPut.jpg)]](https://file2.kaopuke.com:8081/files_image/2023062822/d90c52cdf434408f96deafd5c14a4806.jpg)
flip(),切换为读就绪状态
charBuffer.flip();
limit切到position位置,position切到首位
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ut3rLIsN-1628528570411)(imageBufferFlip.jpg)]](https://file2.kaopuke.com:8081/files_image/2023062822/c32a4af9585d4962826c37d775a73677.jpg)
get()读取
每读取一次元素,positio后移一位
charBuffer.get();//循环调用5次,读取"Hello"
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Di0AY3Od-1628528570413)(imageBufferGet.jpg)]](https://file2.kaopuke.com:8081/files_image/2023062822/95ce034b6a404e99a4fbb0c6bc675456.jpg)
Mark()标记,reset()恢复标记位
mark()将mark置于position位置,reset()重新将position恢复到mark位置
charBuffer.mark()
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8lwzcUmI-1628528570414)(imageBufferMark.jpg)]](https://file2.kaopuke.com:8081/files_image/2023062822/dccfb94c13f1412c8037f4b7b691b460.jpg)
最后
以上就是糟糕钥匙最近收集整理的关于Java IO详解:从IO了解数据缓存的基本思想(二)Buffer(以ByteBuffer为例)的全部内容,更多相关Java内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复