首页 » Java程序员修炼之道 » Java程序员修炼之道全文在线阅读

《Java程序员修炼之道》2.1 Java I/O简史

关灯直达底部

要品出NIO.2 API设计的真正味道,并深刻理解它们的用法,应该先弄清Java I/O的历史。但我们非常理解你想要接触代码的渴望。别着急,你的这种渴望可以在2.2节得到满足。

如果你发现某些API的用法非常简单甚至有点古怪,本节会帮助你从API设计者的角度看待NIO.2。这是Java I/O的第三个主要版本,所以让我们回顾一下Java对I/O支持的发展历史,看看NIO.2是怎么产生的。

Java之所以能够广泛流传,其强大、丰富、简明的类库功不可没,编程时要解决的大多数问题几乎都可以在其中找到支持。但经验丰富的Java开发人员都知道,在老版本的Java中,有些地方不是那么给力。曾经让他们最崩溃的就是Java的输入/输出(I/O)API。

2.1.1 Java 1.0到1.3

在Java的早期版本(1.0~1.3)中没有完整的I/O支持。也就是说开发人员在开发需要I/O支持的应用时,要面临如下问题。

  • 没有数据缓冲区或通道的概念,开发人员要编程处理很多底层细节。
  • I/O操作会被阻塞,扩展能力受限。
  • 所支持的字符集编码有限,需要进行很多手工编码工作来支持特定类型的硬件。
  • 不支持正则表达式,数据处理困难。

基本上,早期版本的Java缺乏对非阻塞I/O的支持。开发人员万般无奈,只好自己实现可伸缩的I/O解决方案。在Java 1.4发布之前,Java一直没能在服务器端开发领域得到重用,我们认为主要原因就是缺乏对非阻塞I/O的支持。

2.1.2 在Java 1.4中引入的NIO

为了解决这些问题,Java开始实现对非阻塞I/O的支持,与其他I/O特性一起,帮助开发人员交付更快、更可靠的I/O解决方案。其中有两次主要改进:

  • 在Java 1.4中引入非阻塞I/O;
  • 在Java 7中对非阻塞I/O进行修改。

2002年发布Java 1.4时,非阻塞I/O(NIO)以JSR-51的身份加入到Java语言中。下面这些特性就是那时增加的。自此之后,Java语言终于得到了服务器端开发人员的青睐:

  • 为I/O操作抽象出缓冲区和通道层;
  • 字符集的编码和解码能力;
  • 提供了能够将文件映射为内存数据的接口;
  • 实现非阻塞I/O的能力;
  • 基于流行的Perl实现的正则表达式类库。

Perl——正则表达式之王

毋庸置疑,Perl编程语言是正则表达式处理之王。实际上,它的设计和实现相当出色,甚至很多编程语言(包括Java)竞相模仿Perl的语法和语义。如果你对Perl语言感兴趣,可以访问http://www.perl.org/一探究竟。

NIO无疑使Java向前迈出了一大步,但I/O编程对Java开发人员来说仍然是个挑战。特别是对于文件系统中的文件和目录处理而言,支持力度还是不够。那时的java.io.File类有些比较烦人的局限性。

  • 在不同的平台中对文件名的处理不一致。1
  • 没有统一的文件属性模型。(比如读写访问模型)
  • 遍历目录困难。
  • 不能使用平台/操作系统的特性。2
  • 不支持文件系统的非阻塞操作。3

1 一些批评者会说Java没有兑现“一次编写,处处运行”的承诺。2 人们通常希望能够使用Linux/UNIX中的符号链接机制。3 Java 1.4的确支持网络套接字的非阻塞操作。

2.1.3 下一代I/O-NIO.2

为了突破这些局限性,同时也为了支持现代硬件和软件I/O的新范例,由阿兰•波特曼主导的JSR-203应运而生。JSR-203最终变成了我们在Java 7中见到的NIO.2 API。它有三个主要目标,JSR-203规范中的第2.1节对它们进行了详细的介绍(http://jcp.org/en/jsr/detail?id=203)。

  1. 一个能批量获取文件属性的文件系统接口,去掉和特定文件系统相关的API,还有一个用于引入标准文件系统实现的服务提供者接口。
  2. 提供一个套接字和文件都能够进行异步(与轮询、非阻塞相对)I/O操作的API。
  3. 完成JSR-51中定义的套接字——通道功能,包括额外对绑定、选项配置和多播数据报的支持。

接下来让我们从新文件系统的基础Path和它的朋友们开始吧!