Java NIO 总览
该系列文章翻译自:http://tutorials.jenkov.com/java-nio/overview.html
留作记录而已,顺便方便大家查阅
Java NIO 包含以下核心组件:
- Channels
- Buffers
- Selector
Java NIO具有比这些更多的类和组件,但是我认为Channel,Buffer和Selector构成了API的核心。 其余的组件(例如Pipe和FileLock)仅是实用程序类,可以与三个核心组件结合使用。因此,在本NIO概述中,我将重点介绍这三个组件。其他组件在本教程的其他地方以其自己的文本进行了说明。请参阅此页面右侧的菜单。
Channels 和 Buffer
通常,NIO中的所有IO均以通道开头。通道有点像流。从通道可以将数据读入缓冲区。数据也可以从缓冲区写入通道。这是一个说明:
Java提供了几种和Buffer类型。下面是Java NIO中主要Channel实现的列表:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
其中涵盖了UDP/TCP这两网络IO,还有文件IO。
这些类也有一些有趣的接口,但是为了简单起见,我将它们排除在Java NIO概述之外。在本Java NIO教程中的其他相关文本中将对它们进行解释。
下面是Java NIO中提供的核心Buffer列表:
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
这些Buffer涵盖了可以通过IO发送的基本数据类型:字节,短,整数,长,浮点,双精度和字符。
Java NIO还具有MappedByteBuffer,它与内存映射文件结合使用。不过,我在概述中并不准备提及。
Selectors
选择器允许单个线程处理多个Channel。 如果您的应用程序打开了许多连接(Channel),但每个连接的流量很少,应该尝试使用Selector。例如,在聊天服务器中。 这是使用Selector同时处理3个通道的线程的图示:
使用Selector时,需要将Channel注册到Selector上。 然后调用它的select()方法。该方法将一直阻塞,直到注册的某一个Channel有一个事件发生。事件发生后会停止阻塞,线程即可处理这个事件。事件示例有:传入连接、接收到的数据等。