Java NIO 概览,原文地址:http://tutorials.jenkov.com/java-nio/overview.html
Java NIO 包括如下几个核心模块:
- 通道
- 缓冲区
- 选择器
当然了,Java NIO 还有很多其他的类和模块,但是在我看来,其核心内容就是由以上三项组成的。像 管道(Pipe)和文件锁(FileLock)等其他的模块仅仅是连接这三个模块的工具类而已。因此,我将重点讲解这三个核心模块的内容,其他模块的讲解以后再单独讲解。
通道和缓冲区
通常,使用 NIO 后所有的 IO 操作都会从一个通道开始。这里所说的通道有点像流的含义。数据可以从通道读到缓冲区中,也可以从缓冲区写入到通道中。请看下面的插图:
Java NIO 中有多种通道和缓冲区。以下列举了主要的通道的实现:
- 文件通道
- 数据报通道
- 套接字通道
- 服务器端套接字通道
正如你看到的,这几种通道涵盖了 TCP + UDP 网络 IO,以及文件 IO。
这几个通道类有许多好玩的内容,但是在这里限于篇幅问题,我并不会详细说它们,详细的内容在之后相关的小节再具体介绍。
以下是缓冲区的实现:
- 字节缓冲区
- 短整型缓冲区
- 整型缓冲区
- 长整型缓冲区
- 双精度类型缓冲区
- 单精度缓冲区
- 字符缓冲区
这些缓冲区的实现涵盖了 Java 中的原始类型:字节、短整型、整型、长整型、单精度类型、双经度类型以及字符类型(PS:并没有原始类型中的布尔类型)。
Java NIO 中还有一种用于连接内存映射文件的字节映射缓冲区,还是限于篇幅,我不会详细介绍这个字节映射缓冲区。
选择器
一个选择器可以让一个线程管理多个通道。例如在一个聊天服务器中,服务器端会开辟很多连接(这个要取决于客户端的数量),但每个连接上的流量很少(因为客户端仅仅是发送聊天信息而已,不是浏览图片或视频),此时使用选择器就极为方便了。下面的插图展示了使用一个选择器来处理三个通道:
你可以将通道注册到选择器。然后你可以调用选择器的 select()
方法。这个方法将会阻塞线程直到有一个通道触发了有关的事件。一旦这个方法返回,线程就可以处理这些事件。具体的事件就是到来的连接,接收到数据等等。