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关系
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19private 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; } }
示例:
1
2
3CharBuffer charBuffer = CharBuffer.allocate(16); allocate 方法调用了HeapCharBuffer,默认mark=-1,position=0,limit=capacity;
put()写入
每放一个元素,position后移一位
1
2charBuffer.put("Hello,World".toCharArray());
flip(),切换为读就绪状态
1
2charBuffer.flip();
limit切到position位置,position切到首位
get()读取
每读取一次元素,positio后移一位
1
2charBuffer.get();//循环调用5次,读取"Hello"
Mark()标记,reset()恢复标记位
mark()将mark置于position位置,reset()重新将position恢复到mark位置
1
2charBuffer.mark()
最后
以上就是糟糕钥匙最近收集整理的关于Java IO详解:从IO了解数据缓存的基本思想(二)Buffer(以ByteBuffer为例)的全部内容,更多相关Java内容请搜索靠谱客的其他文章。
发表评论 取消回复