Java I/O 进化之路

  • 在正式学习 Java NIO 之前,有必要先了解 Java 的整个 I/O 框架演进过程!

Java I/O 基础

  • Java JDK 1.4 推出 Java NIO 之前,基于 Java 的所有 Socket 通信都采用了同步阻塞IO(Blocking IO—BIO),这种一请求一应答的通信模型简化了上层的应用开发,但是在性能和可靠性方面却存在着巨大的瓶颈。平时使用的 TCP 编程就是典型的 BIO 模型!
  • BIO(Blocking IO)方式导致开发人员在开发高性能的 I/O 程序时,会面临一些巨大的挑战与困难,主要问题如下:

1)没有数据缓冲区,I/O 性能存在问题

2)没有 C 或者 C++ 中的 Channel(通道)概念,只有输入和输出流

3)同步阻塞式 I/O 通信(BIO—Blocking IO),通常会导致通信线程被长时间则塞

4)支持的字符集有限,硬件可移植性不好

  • 于是在 Java 支持异步 I/O 之前的很长一段时间内,高性能服务器开发领域一直被 C++ 和 C 语言长期占据,因为它们可以直接使用操作系统提供的异步 I/O(AIO) 能力。
  • 当并发访问量增大、响应时间延迟增大之后,采用 Java BIO (Blocking IO)开发的服务器软件只能通过硬件的不断扩容来满足高并发和低延迟,这极大地增加了企业的成本,并且随着集群规模的不断膨胀,系统的可维护性也面临巨大的挑战,只能通过采购性能更高的硬件服务器来解决问题,这就导致了恶性循环。
  • 正式由于 Java 传统 BIO (Blocking IO) 的拙劣表现,最终在 Java JDK 1.4 版本提供了新的 NIO(New IO) 类库,Java 也终于开始支持非阻塞 I/O。

Java NIO 发展简史

  • Java JDK 从 1.0 到 1.3,Java 的 I/O 类库都非常原始,很多 Unix 网络编程中的概念或者接口在 I/O 类库中都没有体现,例如 Pipe、Channel、Buffer、Selector 等。
  • 2002 年发布 Java JDK 1.4 时,NIO(New IO) 以 JSR-51 的身份正式随 JDK 发布,新增了 java.nio 包,提供了很多进行异步 I/O 开发的 API 和类库,主要的类和接口如下:

1)进行异步 I/O 操作的缓冲区 ByteBuffer 等

2)支持异步 I/O 操作的管道 Pipe

3)进行各种 I/O 操作(异步或者同步)的 Channel ,包括 ServerSocketChannel、SocketChannel

4)多种字符集的编码能力和解码能力;

5)实现非阻塞 I/O 操作的多路复用器 Selector

6)基于流行的 Perl 实现的正则表达式类库

6)文件通道 FileChannel

  • JDK 1.4 新增的 NIO (New IO)类库极大地促进了基于 Java 的异步非则塞编程的发展与应用,但是仍然有不完善的地方,特别是对文件系统的处理能力不足,主要问题如下:

1)没有统一的文件属性(例如读写权限)

2)API 能力比较弱,例如目录的级联创建和递归遍历,往往需要自己实现

3)底层存储系统的一些高级 API 无法使用

4)所有的文件操作都是同步则塞调用,不支持异步文件读写操作

  • 2011 年 7 月 28 日,Java JDK 1.7 正式发布,它的一大亮点就是将原来的 NIO(New IO) 类库进行了升级,被称为 NIO2.0。NIO2.0 由 JSR-203 演进而来,它主要提供了如下方面的改进:

1)提供了能够批量获取文件属性的 API,这些 API 具有平台无关性,不与特定的文件系统耦合。另外还提供了标准的文件系统的 SPI (Serial Peripheral Interface—串行外设接口),供各种服务提供商扩展实现

2)提供 AIO( Asynchronous IO—异步非阻塞IO)功能,支持基于文件的异步IO操作和针对网络套接字的异步操作

3)完成 JSR-52 定义的通道功能,包括对配置和多播数据报的支持等

猜你喜欢

转载自blog.csdn.net/wangmx1993328/article/details/83039426
今日推荐