Java NIO
(New IO
或 Non Blocking IO
)是从Java 1.4
版本开始引入的一个新的IO
API
,可以替代标准的Java IO API
。NIO
支持面向缓冲区的、基于通道的IO
操作。NIO
将以更加高效的方式进行文件的读写操作。(NIO
非阻塞 IO
操作)。
Java NIO
包含了如下三个核心组件:Channel
、Buffers
、Selectors
。
1.Channel 通道:
操作系统中:通道是一种通过执行通道程序管理I/O操作的控制器,它使主机(CPU和内存)与I/O操作之间达到更高的并行程度。需要进行I/O操作时,CPU只需启动通道,然后可以继续执行自身程序,通道则执行通道程序,管理与实现I/O操作。
Channel
是读写数据的双向通道,可以从 Channel
将数据读入 Buffer
,也可以将 Buffer
中的数据写出到 Channel
。Channel
类似于Stream
,但是 Stream
输入输出流一般是单向传递,而Channel
是双向传递的,既可以输出又可以输入)
常见的Channel
有:
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
2.Buffer 缓冲区:
缓冲区(Buffer
):缓冲区本质上是一个读写数据的内存块,可以理解成是一个容器对象(含数组),该对象提供了一组方法,可以更轻松地使用内存块,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况。Channel
提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由Buffer
。
Buffer
则用来缓冲读写数据,NIO
提供的 Buffer
涵盖了可以通过IO
发送所有数据类型:byte
、short
、int
、long
、float
、double
和character
。
ByteBuffer
:MappedByteBuffer
、DirectByteBuffer
、HeapByteBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
CharBuffer
3.Selector 选择器:
Selector
允许单个线程处理多个Channel
。如果您的应用程序打开了许多连接(通道),但每个连接上的流量很低,那么这很方便。
要使用Selector
,请向其注册Channel
。然后调用它的select()
方法。此方法将阻塞,直到某个已注册通道有一个事件准备就绪。一旦方法返回,线程就可以处理这些事件。事件的示例包括传入连接、接收的数据等。