# NIO
# 特性
- 所有原子类型提供Buffer缓存的支持
- 字符集编码解码解决方案
- Channel抽象
- 支持🔒与内在映射文件的访问接口
- 多路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重置到这个位置 |
Flip() 函数将一个能够继续添加数据元素的填充状态的缓冲区翻转成一个准备读出元素的释放状态。(等价于执行buffer.limit(buffer.position()).position(0); )
Rewind() 函数与flip()相似,但不影响上界属性。它只是将位置值设回0 。可以使用rewind() 后退,重读已经被翻转的缓冲区中的数据。
Clear()函数将缓冲区重置为空状态。它并不改变缓冲区中的任何数据元素,而是仅仅将上界设为容量的值,并把位置设回0,这使得缓冲区可以被重新填入
# java.nio.charset:(提供编码解码一套解决方案)
阻塞式网络IO:多线程处理多个连接,会带来大量线程上下文切换
非阻塞式网络IO:由一个专门的线程来处理所有的IO事件,并负责分发
事件驱动机制:事件到时触发,而不是同步去监听
线程通讯:线程间使用wait,notify等方式通信,减少不需要的线程切换
# 异步IO核心API:
selector | NIO核心类,检测一个或多个channel上事件,并将事件分发 |
selectionKey | 包含事件的状态信息和对应的通道的绑定 |