JAVA NIO

JAVA NIO

Java的NIO是通过多路复用SelectorChannelBuffer,来实现

1547897127407

NIO相较于传统I/O(BIO)

  1. NIO是面向缓冲区的。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动,这就增加了处理过程中的灵活性。这个可以用于数据包的重组、粘包、拆包等操作。

    传统I/O是面向流的,数据只能在一个流中连续读写,数据没有缓冲,所以字节流也无法前后移动

  2. 传统I/O是阻塞的,NIO属于非阻塞,就是上面说的多路复用。

Selector

通过selector(选择器)管理所有的I/O,Connection,accept 客户端和服务端的读写—I/O事件

当I/O事件注册到selector,会被分配一个key,当I/O完成再通过key来找到对应的Channel,通过Channel做数据的接收发送操作。selector用于管理监听多个Channel事件,因此一个线程可以实现对多个数据Channel管理。

13957164-539fcf908e51b229

13957164-3d8041ee5b735b73

Buffer

在 Java NIO 中负责数据的存取(存储和读取)。缓冲区就是数组。用于存储不同数据类型的数据

缓冲区中的四个核心属性:
capacity : 容量,表示缓冲区中最大存储数据的容量。一旦声明不能改变。
limit : 界限,表示缓冲区中可以操作数据的大小。(limit 后数据不能进行读写)在写模式下,缓冲区的limit表示你最多能往Buffer里写多少数据; 写模式下,limit等于Buffer的capacity.。 读模式,limit意味着你还能从缓冲区获取多少数据。
position : 位置,表示缓冲区中正在操作数据的位置。当写数据到缓冲时,position表示当前待写入的位置,position最大可为capacity – 1;当从缓冲读取数据时,position表示从当前位置读取。

mark : 标记,表示记录当前 position 的位置。可以通过 reset() 恢复到 mark 的位置

0 <= mark <= position <= limit <= capacity

13957164-8c4827d042813fce

Channel

NIO的通道类似于流,但有些区别如下:

  1. 通道可以同时进行读写,而流只能读或者只能写

  2. 通道可以实现异步读写数据

  3. 通道可以从缓冲读数据,也可以写数据到缓冲: 可以从通道读取数据到缓冲区,也可以把缓冲区的数据写到通道中

13957164-c970757320fbbc30

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eric.Cui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值