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

 结束。

天道酬勤

原文地址:https://www.cnblogs.com/lwhblog/p/10837580.html