Article Outline
NIO基础
nio non-blocking io 非阻塞io
NIO的三大组件
1、Channel &Buffer
channel 类似于stream,它是读写数据的双向通道,可以通过channel将数据读入buffer,也可以将buffer的数据写入channel,而stream要么是写入,要么是输出,channel相对于strean更加底层
channel的分类:
- FileChannel 文件读写相关通道
- DatagramChannel udp开发相关的通道
- SocketChannel tcp相关的通道
- ServerSocketChannel 服务器端用 tcp相关的通道
buffer用于缓存读写数据,常见buffer有:
- ByteBuffer
- MapperedByteBuffer
- DirectByteBuffer
- HeapByteBuffer
- ShortBuffer
- IntBuffer
- LongBuffer
- FloatBuffer
- DoubleBuffer
- CharBuffer
2、selector 选择器
早期的服务器设计模型是 一个socket对应一个线程,多线程版导致 内存占用高,线程上下文切换成本高,只适合连接数少的场景。
selector的作用是配合一个线程来管理多个channel,获取这些channel上发生的事件,这些channel工作在非阻塞模式下,不会导致线程卡死在一个channel上,适合连接数特别多。流量低的场景。调用selector的select()会阻塞直到channel发生了读写就绪事件,这些事件发生,select方法就会返回这些事件交给thread处理。
ByteBuffer结构:
byteBuffer有一下属性:
capacity,position,limit
为什么要进行buffer的读写切换
- 写模式下。position为写入位置,limit等于容量,
- 切换读模式后(flip):position切换为读取位置,limit切换为读取限制(读取限制,即写模式下的写入位置,表示数据就读了这么多,往下读没有了)
- 其实读写模式只是逻辑上的概念,最终决定读取内容的,是buffer中的指针(下标的位置);
allocate
ByteBuffer.allocate(xx); //堆内存,读写效率较低,受到GC影响
ByteBuffer.allocateDirect(xx);//直接内存,不受GC影响,分配效率低,注意释放,否则会造成内存释放。