Java NIO主要包括以下核心组件:
- 通道
- 缓冲区
- 选择器
Java NIO包含比以上更多的类和组件,但是通道,缓冲区和选择器是核心的API。在我看来,其他的组件,例如Pipe和FileLock是被用来连接这些核心组件的工具类。因此,在这部分我们主要这三个组件。其他组件我们在其他的章节进行讲述。
Channels和Buffer
通常,在NIO中的所有IO操作从Channel开始。Channel有点像流。数据可以通过Channel写入缓冲区,也可以通过Channel从缓冲区读取数据.如下面的图示
Java NIO: Channels read data into Buffers, and Buffers write data into Channels
存在几个Channel和Buffer类型。下面是在Java NIO中Channel的几个主要实现
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
如你所见,这些通道包含了TCP+UDP的网络IO,文件IO。
下面是在Java NIO中Buffer的主要实现类:
ByteBuffer
CharBuffer
DoubleBuffer
FloatBuffer
IntBuffer
LongBuffer
ShortBuffer
这些Buffer类包含了你可以通过IO发送的基本数据类型:byte short int long float double char
Java NIO还用一个MappedByteBuffer类被用来连接内存映射文件。
Selectors
一个Selector允许单个线程处理多个通道。当你的程序有多个连接打开,且每个连接的负载比较低,可以考虑使用Selector.比如,一个聊天室服务器:
下面是使用一个Selector处理三个Channel的例子:
Java NIO: A Thread uses a Selector to handle 3 Channel's
将多个通道注册到一个Selector上。然后你可以调用select()方法。这个方法会阻塞直到注册到这个Selector上的其中一个Channel准备就绪。一旦这个方法返回,我们就可以处理这些事件。