个人理解JAVA-NIO

本文介绍了JavaNIO(非阻塞IO)的核心组件:Channel、Buffer和Selector。Channel是双向数据传输的通道,Buffer是内存缓冲区,Selector用于多路复用。文章详细讲解了Buffer的capacity、position和limit属性及其在读写模式下的变化,以及如何通过flip()和clear()等方法在读写模式间切换。
摘要由CSDN通过智能技术生成

本篇文章记录自己学习JAVA NIO的理解。

简介

java nio称为new io(新的io),也称为(non-blocking io)非阻塞io(其实也可以阻塞)
java nio主要面向的是缓冲区(Buffer)的块IO

三大组件

Channel:双向数据传输通道。以前的java io使用的是输入流/输出流
Buffer:内存缓冲区。
Selector:选择器。多路复用
nio实现网络通信编程结构
根据上图可以这么理解
服务端创建一个线程,线程创建选择器,使用channel的register方法将channel注册到selector中,配置指定监听事件,然后运行selector.select()方法,然后运行读写方法Buffer

Buffer


capacity:属性介绍
表示内部容量大小。一旦写入的对象数量超过了capacity容 量,缓冲区就满了,不能再写入了。
capacity一旦初始化,就不能改变了。Buffer类的对象在初始化,会按照capacity分配内部数组的内存,在数组内存分配好之后,它的大小当然就不能改变了


position:属性介绍
读写指针标识当前位置
position属性的值与缓冲区的读写模式有关。在不同的模式下,position属性值的含义是不同的,在缓冲区进行读写的模式改变时,position值会进行对应的调整

写入模式下,position的值变化规则如下:
(1)在刚进入到写入模式时,position值为0,表示当前的写入位置为从头开始。
(2)每当一个数据写到缓冲区之后,position会向后移动到下一个可写的位置。
(3)初始的position值为0,最大可写值为limit–1。当position值达到limit时,缓冲区 就已经无空间可写了。

读模式下,position的值变化规则如下:
(1)当缓冲区刚开始进入到读取模式时,position会被重置为0。
(2)当从缓冲区读取时,也是从position位置开始读。读取数据后,position向前移动
到下一个可读的位置。
(3)在读模式下,limit表示可以读上限。position的最大值,为最大可读上限limit,当 position达到limit时,表明缓冲区已经无数据可读。
Buffer的读写模式具体如何切换呢?当新建了一个缓冲区实例时,缓冲区处于写入模式,这时是可以写数据的。在数据写入完成后,如果要从缓冲区读取数据,这就要进行模 式的切换,可以使用(即调用)flip翻转方法,将缓冲区变成读取模式。

在从写入模式到读取模式的flip翻转过程中,position和limit属性值会进行调整,具体的
规则是:
(1)limit属性被设置成写入模式时的position值,表示可以读取的最大数据位置;
(2)position由原来的写入位置,变成新的可读位置,也就是0,表示可以从头开始 读。


limit:属性介绍
(1)在写入模式下,limit属性值的含义为可以写入的数据最大上限。在刚进入到写入 模式时,limit的值会被设置成缓冲区的capacity容量值,表示可以一直将缓冲区的容量写满。
(2)在读取模式下,limit的值含义为最多能从缓冲区中读取到多少数据。 一般来说,在进行缓冲区操作时,是先写入然后再读取的。当缓冲区写入完成后,就可以开始从Buffer读取数据,可以使用flip翻转方法,这时,limit的值也会进行调整。具体 如何调整呢?将写入模式下的position值,设置成读取模式下的limit值,也就是说,将之前 写入的最大数量,作为可以读取的上限值。

简单说明:
capacity:容量,即可以容纳的最大数据量;在缓冲区创建时设置并且不能改变
limit:上限,缓冲区中当前的数据量
position:位置,缓冲区中下一个要被读或写的元素的索引
mark:调用mark()方法来设置mark=position,在调用reset()可以让position恢复到mark标记的位置,即position=mark

常用方法:

方法名称方法介绍
allocate()创建指定参数容量的缓冲区对象
flip()翻转,将写模式转换成读模式
clear()清空,将读模式转换成写模式
get()取出当前position指针索引下的值并且改变position值,加上参数不会改变值
rwind()倒带i,将读写指针回退到1,不管读写模式

创建Buffer对象
可以之间查看代码,使用allocateDirect方法与allocate方法创建。这两个方法创建的对象使用环境有所不同
一般如果一个ByteBuffer经常被重用的话,就可以使用DirectByteBuffer对象。如果试试需要经常释放和分配的地方用HeapByteBuffer
创建Buffer对象
可以看出来使用堆内存对象还有一层异常判断

get有参与无参方法对比
主要就是读写指针是否更改,使用有参position不会更改,使用无参将会发生position后移
方法定义
在这里插入图片描述

暂时先记录这些,后续在补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值