NIO核心图如下:
将所有通道注册到Selector上,通过Buffer来执行对数据的操作
1.缓冲区Buffer
1.1 设计原理
类图:
可以看到,除了boolean,其他七个基本类型都有
MappedByteBuffer:能够实现内存与磁盘的同步更新
本质上是一个数组,不过做了一些封装;任何时候访问NIO中的数据,都是将它放到缓冲区中,而BIO中则是直接读取到Stream中
相关属性、方法:
capacity:容量
limit:可操作范围
mark:https://www.cnblogs.com/qiumingcheng/p/9486925.html
position:get/put的当前位置/索引
clear():清空
flip():固定当前缓冲区
下面以几个图来演示一下状态变化:
1.初始,allocate(10):
2.put()四次数据:
3.需要将缓冲区的数据取出来解析了,则需要调用flip(),使我们只能操作从0到4的数据,如果超出这个范围的get,报错为BufferUnderflowException,put报错为BufferOverflowException,这是一个很牛逼的设计理念:
4.get()开始取数据,get()四次:
5.调用clear(),回到初始状态:
2.通道Channel
在NIO中,所有的IO操作都从一个Channel开始。Channel中的数据要么写入Buffer,要么从Buffer读取
类图:
3.反应堆
工作原理图:
反应堆是一个概念,下面看看其落地实现:
3.1 Selector
架构本质就是一个线程负责轮询,分发:
源码分析:
涉及的相关类以及方法:
FileChannel ServerSocketChannel SocketChannel ByteBuffer
ByteBuffer方法:warp#slice#allocate#allocateDirect#asReadOnlyBuffer#MapperByteBuffer#put#get#flip#clear
1.1 selector = Selector.open();:
//java.nio.channels.Selector#open
public static Selector open() throws IOException {
return SelectorProvider.provider()