JDK 1.4的I/O API改善了的原有的性能,包括缓冲区管理、用于网络和文件的可伸缩I/O操作、用于字符集转换的编码器和解码器,以及用于模式匹配的正规表达式。难怪人们把JDK 1.4当作Java开发的巨大进步。让我们快速浏览一下JDK 1.4的新I/O操作,看看它向我们提供了什么。
JDK 1.4的I/O被认为是新的,其原因是它提供了一些额外的支持。例如在非阻断 I/O在UNIX和Windows里出现过,但是Java只支持先前版本的阻断I/O,因为它设计适用的对象是PC和其他电子设备,从智能卡到超级计算机。
几个大型的Java支持商,例如BEA 系统、IBM和Sun,定义了新I/O的规范。这些企业都是高吞吐量Java应用程序,如WebLogic和WebSphere的大型支持商。
现在我们来看看JDK 1.4里I/O的增加的一些功能,包括缓冲区、字符集转换、正规表达式、通道、高级文件处理和非阻断I/O等。
缓冲区提供了保存数据集的容器。把它们当作带有固定容量数组的DataInputStream和DataOutputStream的组合。你可以使用它们读取或者编写专用的基本数据元素。
新I/O提供了七种类型的缓冲区:
每个缓冲区都只能容纳一个专用的基本数据元素,但是ByteBuffer除外。
Listing A显示了缓冲区的基本机制。叫做buff的CharBuffer对象从args[0]读取字符串,然后把它写到标准的输出。
注意,缓冲区的成员方法length()和数组的数据成员长度是不同的。缓冲区的成员方法返回的是CharBuffer对象的剩余长度。通过返回CharBuffer对象的长度,它像DataInputStream或者DataOutputStream一样工作,但是它既可以读也可以写。
此外,缓冲区能够被分为非直接缓冲区或者直接缓冲区。非直接缓冲区在逻辑上是用来保存数据的,所以你不需要担心内存的分配。Listing A里的例子用到了非直接缓存。另一方面,直接缓冲区是用来创建连续内存块的。你会在本文所用的源代码里找到一个直接缓冲区。由于直接缓冲区需要系统本地的I/O操作,选择直接还是非直接缓冲区的时候要考虑其创建的代价和性能。