Java NIO 包括了下面几个核心组件
- Channels
- Buffers
- Selectors
Java NIO 有很多的类和组件,但核心的是 Channels
, Buffers
和Selectors
。
其它的组件,像 Pipe
和 FileLock
,只是跟上面这三个核心组件组合使用的工具类。
因此我们着重介绍这三个核心组件。
Channels and Buffers
通常,所有的IO操作在NIO中都会开始于 Channel
。
一个Channel
类似于stream
,数据从Channel
读取到Buffer
, 数据也可以从Buffer
写入到Channel
。
它们的关系就是下面这个图示:
下面是一些主要的Channel
实现类,这些Channel
覆盖了 UDP + TCP network IO 和 File IO
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
下面是一些主要的Buffer
实现类,覆盖了基本数据类型: byte
, char
, double
, float
, int
, long
, short
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffe
Selectors
Selector
可以让一个线程同时处理多个Channel
。适用于我业务系统同时有多个低流量的连接,比如即时通讯。
下面是一个Selector
处理多个Channel
的示例图:
要使用Selector
,你需要注册Channel
到Selector
,然后调用Selector
的select()
方法。
这个方法会一直阻塞直到监听到有Channel
注册事件。只要这个方法正常返回了,线程就可以处理这些事件,比如建立了连接、收到了客户端发送的数据等等。