本文章翻译自国外文献,作者水平有限,推荐阅读原文,原文见:http://tutorials.jenkov.com/java-nio/overview.html
Java NIO 包含以下几个核心组件:
1. Channels
2. Buffers
3. Selectors
组成Java NIO的类和文件远远不止上边三个,但是我认为其中Channel,Buffer和Selector是Java NIO API的核心组件,
其他的组件,比如Pipe和FIleLock和三个核心组件并不经常联合使用。因此,在这篇综述中,我将把重点放在这三大组件上。
Channels and Buffers
通常,所有NIO中的IO起始于一个Channel,一个Channel就是一个比特流,能够从中把数据读到一个Buffer中,也可以把数据从Buffer写到一个Channel中。
如图:
Java NIO:从Channel中读数据到buffer和从buffer中写数据到Channels
在Java NIO中有几种不同形式的Channel和Buffer,下边是Channel的实现类:
1. FileChannel
2. DatagramChannel
3. SocketChannel
4. ServerSocketChannel
如你所见,这些Channels涵盖了UDP+TCP网络IO和文件IO。
为了文章的简介,还有一些和他们相关的接口我留在其他文章中讲。
下边是Buffer的实现类:
1. ByteBuffer
2. CharBuffer
3. DoubleBuffer
4. FloatBuffer
5. IntBuffer
6. LongBuffer
7. ShortBuffer
这些Buffer涵盖了可以通过IO传输的所有基本数据类型:byte,short,int,long,float,double 和characters。
其实,Java NIO还有一个MappedByteBuffer,它用来处理内存映射文件,在这篇文章中不讲它。
Selectors
一个Selector允许一个线程监控多个Channels,这个就很方便,如果你有多个连接打开但是每个连接数据量很少。例如,在
一个聊天服务器中。
下图是一个线程用一个Selector监听3个Channel。
要使用Selector,你必须向他注册Channels,然后可以调用它的select()方法,这个方法是阻塞的直到一个channel中有事件发生。
一旦方法返回,线程能够处理这些事件,例如有新连接或者有数据到达。