首先Java中的IO有以下三种:
BIO(Blocking IO) 同步式阻塞IO
NIO(Non-BlockingIO/New IO) 同步式非阻塞IO JDK1.4提供
AIO(AsynchronousIO) 异步式非阻塞IO JDK1.8提供
BIO vs NIO
BIO | NIO |
---|---|
一对一连接 | 一对多连接 |
线程阻塞 | 线程非阻塞 |
单向传输 | 双线传输 |
适用请求少,长连接的场景 | 适用于请求多,短连接的场景 |
NIO
NIO是jdk1.4提供的用于数据传输的流。主要有三大组件:
⚪ Buffer
⚪ Channel
⚪ Selector
1.Buffer 缓冲区
Buffer是用于存储数据的容器,在内存中占了一块连续的空间,本质上是一个数组,Java中针对基本类型提供了不同的的缓冲区(没有Boolean),ByteBuffer(字节缓冲区)是最基本的缓冲区。
ByteBuffer 继承了Buffer类,底层是靠字节数组来存储数据,是一个抽象类,需要用其子类创建对象,或者用提供的allocate/wrap方法来创建对象
重要的位置(4个):capacity>=limit>=position>=mark
capacity:容量位,表示缓冲区容量,创建好后不再改变
limit:限制位,用于限制操作(position)时能达到的最大位置,缓冲区刚创建时位于capacity位置
position:操作位,表示当前操作的位置,缓冲区刚创建时位于0
mark:标记位,用于操作过程中标记,缓冲区刚创建时位于-1,默认不开启
常用的API:
2. Channel通道
用于数据传输,面向缓冲区,可以实现双向传输。
channel默认是阻塞的,需要手动调整成非阻塞。
三种类型:
1)FileChannel:面向文件的通道,用于对文件的读写
2)UDP:用于进行UDP收发的通道,是无连接的网络协议,只能进行发送和接受的操作。基本类是DatagramChannel,是一个抽象类。
3)TCP:用于TCP的通信通道,有连接的网络协议,可以进行连、接、读、写操作。客户端通道时SocketChannel,服务器通道是ServerSocketChannel。
- Selector 多路复用选择器
对通道进行选择,需要基于事件来驱动。主要是四类事件:connect、accept、read、write,全部定义在SelectionKey中。
可以实现利用一个和少量线程完成大量请求的的场景,不适用于长任务场景,并且selector只是针对非阻塞的通道的。
来源:CSDN
作者:Vivian文文
链接:https://blog.csdn.net/chazhen2780/article/details/104375059