NIO中buffer常用方法学习笔记
NIO:Non-block I/O 非阻塞IO
非阻塞IO的读写一般是通过缓冲区(buffer)来实现的,下面对buffer的一些常用属性和方法简单的记录一下。
重要属性:
mark:标记--用于标记position的位置
position:记录下一次要操作的位置
limit:可操作数据的上限
capacity:缓冲区容量
属性之间关系:0<=mark<=position<=limit<=capacity
下面通过几张图讲解下buffer的几个方法(以bytebuffer)为例:
//1.分配一个大小为10的缓冲区
ByteBuffer buf = ByteBuffer.allocate(10);
此时缓冲区状态如下图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/201904072141345.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIxMzM1NzYz,size_16,color_FFFFFF,t_70)
//2.存入数据到缓冲区
String str = "hello";
buf.put(str.getBytes());
此时缓冲区状态如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190407214650432.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIxMzM1NzYz,size_16,color_FFFFFF,t_70)
//3.步骤2中执行put是执行缓冲区的写模式,此时要转换到读模式需调用flip()方法
buf.flip();
此时缓冲区状态如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190407215136748.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIxMzM1NzYz,size_16,color_FFFFFF,t_70)
此时position回到缓冲器开始位置,limit变为5,此时读模式已经准备就绪。
//4.开始读取数据
byte[] arr = new byte[buf.limit()];
buf.get(arr);
此时将buf中的数据读取到arr中,读取后缓冲区状态如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190407215802404.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIxMzM1NzYz,size_16,color_FFFFFF,t_70)
//5.若需要重复读取数据则调用rewind()方法,该方法可以使得position变为0,使得
可以从头开始读取数据
buf.rewind();
此时缓冲区状态如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190407224046745.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIxMzM1NzYz,size_16,color_FFFFFF,t_70)
//6.读取完成后需要清空缓冲区则执行clear();
buf.clear();
![在这里插入图片描述](https://img-blog.csdnimg.cn/2019040722412587.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIxMzM1NzYz,size_16,color_FFFFFF,t_70)
此时缓冲区中的数据依然存在,此时数据处于“被遗忘”状态