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: 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:
要使用一个selector,首先要在Channel上注册它,然后调用Select()方法。Select()会一直阻塞到注册的Channel当中至少一个有事件通知。一旦方法返回,线程就可以处理剩下的“事件”了。典型场景如读数据等。