Nio Buffer
这篇博客是为了记录下自己学习nio Buffer这一块一些粗浅的了解
java io
我们首先直到,java io是面向流的编程,并且,一个流要么是输出流,要么是输出流,不肯能即是输入流又是输出流。
java nio
首先了解一下java nio中三个核心概念:Selector,Channel,Buffer
nio还是面向块(block)或是缓冲区(buffer)编程
bufferbytes.flip()是实现状态的翻转,进行读写切换一定要调用flip
Channel是双向的
既然谈到了buffer,那么就说一下NIO Buffer中的三个重要的状态属性,这也是这篇的主题
首先介绍一下概念
position:下一个将要读或者写的元素的索引
limit开始指向capacity的位置,当读完后执行flip,Potition指向开头,limit指向position原先的位置
我们用画图来更直观的了解
开始状态
读入两个数据
再读入两个数据
flip后,需要些数据,Position是指向开头,limit指向原先position的位置
写出两个数据
最多只能写到limit所在的位置
Buffer本身不是线程安全的
根据代码的现象来看,我做了一些总结
如果这个时候把数据拿出去的话,那么新写进来的两个数据不会被读取到
而是输出position到limit之间的数据
你再执行flip,就变成了这个酱紫
clear只是对Position和limit的位置做了初始化的调整(就是position = 0,limit = capacity),buffer中的数据并没有清除
下面是一个比较重要的知识
正常运行的结果大家都很清楚:47 -1
那么我们如把clear这段代码注释掉会发生什么呢,答案是死循环,就是循环写
为什么呢
read读取的时候它是先看能不能往buffer中填数据了,如果没有空间(意思position和limit指向同一位置),那么这个read方法直接返回0
只有当buffer中有空间的时候,它才会看inputChannel里面还有没有可以读的数据,如果有,返回读取数据的大小;没有,则返回-1
结束。
天道酬勤