最后更新时间:2014-06-23
Java NIO包含以下几个核心的组件:
- 通道
- 缓冲区
- 选择器
Java NIO除了那些有更多的类和组件,然而在我看来,通道,缓冲区,选择器组成了这个API的核心。其余的组件,像Pipe和FileLock仅仅是作为一个工具类与那三个核心的组件共同被使用。其他的组件在这个教程的其他章节被解释。看这个页面顶层角落的菜单。
通道和缓冲区
典型的,在NIO中的所有IO都是以一个Channel开始。一个Channel是一个比特像一个流。来自Channel中的数据可以读进一个Buffer。数据也可以从一个Buffer写进一个Channel。这个有一个那个的图解。
这儿有几个Channel和Buffer的类型。这儿有一个在Java NIO中主要的Channel实现的列表:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
正如你看到的,这些channels覆盖了UDP和TCP的网络IO,还有文件IO。
这儿也有一些伴随着这些类的一些有趣的接口,但是因为简单的缘由我在这个Java NIO综述里面不介绍他们了。他们将会在Java NIO教程中的其他章节里面有相关的介绍。
这里有一个在Java NIO中核心Buffer的实现:
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
这些Buffer覆盖了你可以通过io发送数据的基本数据类型:byte,short,int,float,double以及字符类型的。
Java NIO中也有一个MappedByteBuffer,这个是通过和内存映射文件结合使用的。但是在这个综述中也不加这个Buffer的介绍。
Selectors(选择器)
一个Selector允许一个单独的线程去处理多个Channel。如果你的应用程序有很多打开的连接(Channels),但是在每一个连接中有很低的传输。例如,在一个聊天服务器中。
这儿有一个使用一个selector的一个线程处理3个Channel的一个图解:
去使用一个selector,你用它注册一个Channel。然后调用它的select()方法。这个方法将会堵塞,直到这里注册中的channels中有一个准备好的事件。一旦这个方法返回,这个线程将会执行这些事件。事件的实例是进来的连接,接收到的数据等等。