NIO与IO的主要区别
- IO面向流单向传输、NIO面向缓冲区双向传输;
- IO阻塞、NIO非阻塞;
- 网络编程NIO多了个选择器
传统io模型的缺点:
传统io单线程模型:如果线程未完成数据处理,新的请求将阻塞;
传统io多线程模型:每个请求都会新启一个线程,阻塞的线程依旧不能做其它事情,cpu利用率仍然不高;
缓冲区(Buffer)
- Buffer 主要用于与NIO 通道进行交互,数据是从通道读入缓冲区,从缓冲区写入通道中的。
- 一个用于特定基本数据类型的容器,Buffer 就像一个数组,可以保存多个相同类型的数据
- Buffer主要参数:容量(capacity)、限制(limit)、位置(position)、标记(mark)、重置(reset)
- 0<=mark<=position<=limit<=capacity
Buffer常见数据类型
- ByteBuffer
- CharBuffer
- ShortBuffer
- IntBuffer
- LongBuffer
- FloatBuffer
- DoubleBuffer
直接缓冲区与非直接缓冲区
- 直接缓冲区:通过 allocateDirect() 方法分配直接缓冲区,将缓冲区建立在物理内存中。可以提高效率
- 非直接缓冲区:通过 allocate() 方法分配缓冲区,将缓冲区建立在 JVM 的内存中
通道(Channel)
- 用于源节点与目标节点的连接,负责缓冲区中数据的传输,Channel 本身不存储数据,因此需要配合缓冲区进行传输;
- 通道的主要实现类
*java.nio.channels.Channel接口:
-
|--SelectableChannel |--SocketChannel |--ServerSocketChannel |--DatagramChannel |--Pipe.SinkChannel |--Pipe.SourceChannel
使用 NIO 完成网络通信的三个核心
- 通道(Channel):负责连接
- 缓冲区(Buffer):负责数据的存取
- 选择器(Selector):是 SelectableChannel 的多路复用器。用于监控 SelectableChannel 的 IO 状况