本文主要是介绍java NIO关于*Buffer的 flip | reset | rewind | clear 的灵活使用备忘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
首先对于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 方法: 重新转换为写状态【把四个状态变量都变为初始状态】(这时候读没有任何意义)
写完才发现好像根本没有必要发。。。但是还是发了吧。。。。。。。。。。。。。。。。。。。。。。。。
这篇关于java NIO关于*Buffer的 flip | reset | rewind | clear 的灵活使用备忘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!