Java NIO由以下核心组件组成:
Channels
Buffers
Selectors
Java NIO本身有很多的类和组件,但是我认为Channel,Buffer和Selector构成了API的核心。其余的组件(例如Pipe和FileLock)仅是实用程序类,可以与这三个核心组件结合使用。因此,重点介绍这三个组件。
1.Channels 和 Buffers
Channel 有点像流。可以从Channel中将数据读到Buffer,也可以将数据从Buffer写到Channel:
有几种Channel和Buffer类型,这是Java NIO中主要实现了Channel的列表:
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
这些通道涵盖UDP + TCP网络IO和文件IO。
这是Java NIO中的核心Buffer的实现列表:
ByteBuffer
CharBuffer
DoubleBuffer
FloatBuffer
IntBuffer
LongBuffer
ShortBuffer
可以很明显的看到,这些Buffer涵盖了可以通过IO发送的基本数据类型。
Java NIO还具有MappedByteBuffer,它与内存映射文件结合使用。
2.Selectors
Selectors允许单个线程处理多个Channel。如果你的应用程序打开了许多连接(通道),但每个连接的流量很少,这将很方便。例如,在聊天服务中。
这是使用Selectors处理3个Channel线程的图示:
要使用Selectors,你应该用它注册一个Channel,然后调用它的select()方法。该方法将一直阻塞,直到一个已注册的Channel返回ready事件。方法返回后,线程即可处理这些事件。事件可以是建立连接,接收到的数据等。