# NIO

# 特性

  1. 所有原子类型提供Buffer缓存的支持
  2. 字符集编码解码解决方案
  3. Channel抽象
  4. 支持🔒与内在映射文件的访问接口
  5. 多路Non-Blocking非阻塞的高伸缩网络IO

# channel & Buffer

Channel:数据源或目的地,buffer对象唯一接口,用于向Buffer写入或读取buffer中数据,异步IO支持

Buffer:连续内在块,Nio数据读或写的中转站。

0 <= mark <= postion <= limit <= capacity
容量 Capacity 能够容纳数据元素的最大数量,创建时设定,不能修改
上界 Limit 缓冲区第一个不能被读或写的元素,或者说现在元素的个数
位置 Position 下一个要读或写的元素的索引,位置会自动根据get put函数更新
标记 Mark 备忘位置,调用mark来设定mark=position,调用 reset 设定postion = mark,标记在定义前是未定义的
写模式 读模式
Position 当前写入位置 当前读取的数据位置
limit 最多能写多少单位数据和容量是一样的 最多能读多少单位数据,和之前写的单位数据量一致
capacity 容量 容量
函数 含义
flip 写模式切换成读模式
rewind position重置为0,一般用于重复读
clear 清空buffer,准备再次写入(position=0,limit=capacity)
compact 把未读取的数据移动到buffer的头位置
mark,reset mark标记一个位置,rest重置到这个位置

new-buffer

buffer-five-put

Flip() 函数将一个能够继续添加数据元素的填充状态的缓冲区翻转成一个准备读出元素的释放状态。(等价于执行buffer.limit(buffer.position()).position(0); )

buffer-flip

Rewind() 函数与flip()相似,但不影响上界属性。它只是将位置值设回0 。可以使用rewind() 后退,重读已经被翻转的缓冲区中的数据。

Clear()函数将缓冲区重置为空状态。它并不改变缓冲区中的任何数据元素,而是仅仅将上界设为容量的值,并把位置设回0,这使得缓冲区可以被重新填入

# java.nio.charset:(提供编码解码一套解决方案)

阻塞式网络IO:多线程处理多个连接,会带来大量线程上下文切换

非阻塞式网络IO:由一个专门的线程来处理所有的IO事件,并负责分发

事件驱动机制:事件到时触发,而不是同步去监听

线程通讯:线程间使用wait,notify等方式通信,减少不需要的线程切换

# 异步IO核心API:

selector NIO核心类,检测一个或多个channel上事件,并将事件分发
selectionKey 包含事件的状态信息和对应的通道的绑定
上次更新: : 5 months ago