关键字:
.Channels and Buffers
.Selectors
Java NIO 由下面三个核心组件组成
.Channels
.Buffers
.Selectors
Java NIO除了上面这三个组件之外,还有许多其他类和组件。但是Channel、Buffer、以及 Selector是主要的核心API。在我看来,其他的组件,如:Pipe 、FileLock 都是一些供核心组件使用的工具类。因此,我将聚焦于这三个核心组件上。其他组件会在其他篇幅中讲述。
1.Channel和Buffer
一般来说,NIO都是从Channel开始。 Channel有点像流stream。可以从Channel中把数据读到Buffer中,也可以从buffer中把数据写入到Channel中。
这里有个图例:

在Java NIO中有不少Channel和Buffer类型,下面列出一些主要的Channel实现:
.FileChannel
.DatagramChannel
.SocketChannel
.ServerSocketChannel
正如你看到的那样,这些channel既包含了UDP、TCP 网络IO也包含文件IO。
下面列出一些核心的Java NIO中的Buffer核心实现:
.ByteBuffer
.CharBuffer
.DoubleBuffer
.FloatBuffer
.IntBuffer
.LongBuffer
.ShortBuffer
这些Buffer也包含了基本数据类型,这样你就可以通过IO去发送 byte,short,int ,long,float,double,以及字符类型的数据。 Java NIO中还有一个MappedByteBuffer,它主要是用于连接内存映射文件。我们稍后再讲这个Buffer。
2.Selectors
Selector 允许一个单线程处理多个Channel。 如果你的应用程序有许多连接(Channel)打开的话,这样是很方便的。但是每一个连接上却只有很少的流量。 例如,在一个chat server上,就可以这样做。
这里有一个图展示了一个线程如何使用一个Selector管理3个Channel的:

为了使用Selector,你首先需要把三个Channel注册到该Selector上。然后,你可以调用select()方法。这个方法会一直阻塞,直到这三个Channel中的其中一个有事件发生(event ready)。一旦这个方法返回,这个线程就能处理这些事件。这些事件例如:新连接到达事件,数据接收事件等。