您的位置:首页 > Web前端

java NIO关于*Buffer的 flip | reset | rewind | clear 的灵活使用备忘

2017-09-03 11:55 1071 查看
首先对于Buffer的理解:

有两种状态:

读 || 写 

四个重要的属性:

capacity: 【Buffer实例最大容量,不可变】

limit: 【Buffer实例最大 {可写 |  可读 } 的值,在写模式下,默认与初始化 给定的 capacity 相等】

position:【在读 || 写 状态下,初始为0, 每 读||写 N个元素,positon+=N 。】

mark: 【position的辅助变量,要显示的调用mark方法来记录最近一次position的位置】

1.flip 方法使用场景:当生产者向Buffer中写入了内容而消费者想要读取的情况

在首次创建Buffer时,buffer实例处于写模式

这四个变量的值依次初始:

mark = -1

position = 0

limit = capacity

capacity = 初始给定

这时调用

channel.read(buffer)

buffer.put*(basicType)  

可以往buffer里写入相应的数据,这时候四个重要属性:

mark = -1
position = 相应写入的数量,最大不能超过limit
limit = capacity
capacity = 初始给定
现在要读取写入的内容,要转换为读状态(更改这四个状态变量)

这时候需要调用 flip() 方法

limit = position; //读取不超过limit内容
position = 0; //要从position处读取
mark = -1;

现在就可以调用相应的操作来从buffer中读取相应的类容

例子:

while(buf.hasRemaining()){
System.out.print((char) buf.get());
}


2.reset 方法:把mark备忘的position赋值给position变量

3.rewind 方法:只把position置为0,也就是在读 || 写 状态下,都可以重新开始读 或 写 ,其他变量保持不变

4. clear 方法: 重新转换为写状态【把四个状态变量都变为初始状态】(这时候读没有任何意义)

写完才发现好像根本没有必要发。。。但是还是发了吧。。。。。。。。。。。。。。。。。。。。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: