NIO

Java NIO 中三大组件 Buffer、Channel、Selector

  • Buffer 和数组差不多,它有 position、limit、capacity 几个重要属性。put() 一下数据、flip() 切换到读模式、然后用 get() 获取数据、clear() 一下清空数据、重新回到 put() 写入数据。
  • Channel 基本上只和 Buffer 打交道,最重要的接口就是 channel.read(buffer) 和 channel.write(buffer)。
  • Selector 用于实现非阻塞 IO

Buffer

一个 Buffer 本质上是内存中的一块,将 Buffer 理解为一个数组

重要属性, position、limit、capacity

capacity,它代表这个缓冲区的容量,一旦设定就不可以更改。

position 和 limit 是变化的,我们分别看下读和写操作下,它们是如何变化的。

position 的初始值是 0,每往 Buffer 中写入一个值,position 就自动加 1,代表下一次的写入位置。读操作的时候也是类似的,每读一个值,position 就自动加 1。

从写操作模式到读操作模式切换的时候(flip),position 都会归零,这样就可以从头开始读写了。

Limit:写操作模式下,limit 代表的是最大能写入的数据,这个时候 limit 等于 capacity。写结束后,切换到读模式,此时的 limit 等于 Buffer 中实际的数据大小,因为 Buffer 不一定被写满了。

Channel

Channel 经常翻译为通道,类似 IO 中的流,用于读取和写入。它与前面介绍的 Buffer 打交道,读操作的时候将 Channel 中的数据填充到 Buffer 中,而写操作时将 Buffer 中的数据写入到 Channel 中。

Selector

选择器,也叫多路复用器


三种io比较

  • io最老
  • nio是1.4的特性
  • aio是1.7的特性

  • io是面向流的,是就用多少拿多少。是阻塞的。数据量不大的或者不在意阻塞的时可以用。

  • nio是面向块的,先把数据搬过来,先存到缓存区里面,如果线程要用从缓存区拿。所以线程不需要时刻盯着io了,可以先做一些其他的事情,过几天再来看一下缓存。是同步非阻塞的。因此,nio里有Buffer类作为缓冲区,Channel(通道)相当于io里的steam的抽象,Selector是nio提供的管理多个Channel的工具。nio出现也是因为io渐渐成为一些程序速度的瓶颈。

  • aio加了一个异步的特性。当我们要拿数据花费时间太长的时候,我们可以考虑使用异步的io。异步就是可以理解为,让io先处理者,我线程先去干别的事情了,你io处理完了通知我一下。aio提供的事件处理接口CompletionHandler,定义了回调函数,这些函数再io完成后会被自动的调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值