Java NIO Overview(2)

Java NIO consist of the following core components:
Java NIO由下面三个核心部分组成:
通道 Channels
缓冲 Buffers
多路复用器 Selectors

NIO当然还有更多的类和组件,但在我看来上面三个概念是NIO API的核心了,其余的,比如Pipe、FileLock只是用这三个核心组件联用的工具类而已。因此,在本篇概览中,我主要还是聚在这三个组件上。其余的会在教程中别的地方介绍到。

Channels and Buffers

总体上,NIO中所有IO都是从channel开始的。channel有点像Stream(流)。程序可将数据从channel读进buffer;同样,程序也能将数据从buffer读进channel。这里有个说明的插图:
Java NIO Overview(2)

Java NIO: Channels and Buffers

JavaNIO:Channels读数据到Buffers,Buffers读数据到Channels。Channels、Buffers有好几种类型。下面是主要的实现:

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

As you can see, these channels cover UDP + TCP network IO, and file IO.
可见:Channels包括了UDP+TCP网络NIO,以及FileIO(文件IO)
除了这些类,还有一些有意思的接口,容后再说。
下面是NIO中实现Buffer接口的一些类:

  • ByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

这些Buffers 涵盖了你可以通过IO发送的基本的数据类型:byte, short, int, long, float, double and characters.(除了布尔)。

NIO还有能够映射到内存中文件的了MappedByteBuffer ,以后也会介绍。

Selectors

一个selector能单线程处理多Channel。如果你的应用保持了很多连接,但每个连接吞吐低,Selector这个特性倒是挺有用的,这里有插图解释了一个Selector处理3个Channel:
Java NIO Overview(2)
要使用一个selector,首先要在Channel上注册它,然后调用Select()方法。Select()会一直阻塞到注册的Channel当中至少一个有事件通知。一旦方法返回,线程就可以处理剩下的“事件”了。典型场景如读数据等。