1、中原工学院信息商务学院毕业设计(论文)译文专用纸 1 Java I/O 系统 对 于 语言的设计者来说,创建一个好的输入 /输出 (I/O)系统是一项更艰难的任务。 现有的大量不同方案已经说明了这一点。挑战似乎来自于要涵盖所有的可能性。不仅存在各种用于通信的 I/O 源端和接收端(文件、控制台、网络链接等),而且还需要以多种不同 的方式与它们进行通信(顺序、随机存取、缓冲、二进制、按字符、按行、按字等)。 Java 类库的设计者是通过创建大量的类来解决这个难题的。一开始,可能会对 Java I/O系统提供了如此多的类而感到不知所措(具有讽刺意味的是, Java I/O 设计 的初衷是为了 避免
2、过多的类)。自从 Java 1.0 版本以来, Java 的 I/O 类库发生了明显改变,在原来面 向字节的类中添加了面向字符和基于 Unicode 的类。在 JDK1.4 中,添加了 nio 类(对于 “新 I/O”这个称呼,从现在这个名字我们仍将要用若干年)用于改进性能及功能。因此,在 充分理解 java I/O 系统以便正确地运用之前,我们需要学习相当数量的类。另外,很有必 要理解 I/O 类库的演化过程,即使我们的第一反应是 “不要用历史打扰我,只需要告诉我怎 么用。 ”问题是,如果缺乏历史的眼光 ,很快我们就会对什么时候该使用某些类,什么时候 不该使用它们而感到迷惑。 输入和输出 I
3、/O 类库中通常使用 “流( stream) ”这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象。 “流 ”屏蔽了实际的 中原工学院信息商务学院毕业设计(论文)译文专用纸 2 I/O 设备中处理数据的细节。 Java 类库中的 I/O 类分成输入和输出两部分,可以在 JDK 文档里的类层次结构中查看到。 通过继承,任何自 Inputstream 或 Reader 衍生而来的类都含有名为 read()的基本方 法,用于读取单个字节或者字节数组。同样地,任何自 OutputStream 或 Writer 衍生而 来的类都含有名为 write()的基本方法,用于写单
4、个字节或者字节数组。但是,我们通常 不会用到这些方法,它们存在是因为别的类可以使用它们,以便提供更有用的接口。因此,我们很少使用一个单一的类来创建流对象,相反我们会通过叠合多个对象来提供所期望的功能。实际上, Java 中 “流 ”类库让人迷惑的主要原因就在于:创建一个单一的结果流,却需 要创建多个对象 。 有必要按照这些类的功能对它们进行分类。在 Java1.0 中,类库的设计者首先限定与输入有关的所有类都应该从 InputStream 继承,而与输出有关的所有类都应该从 OutputStream 继承。 InputStream 类型 InputStream 的作用是用来表示那些从不同数据源
5、产生输入的类。这些数据源包括: 1. 字节数组 2. Sring 对象 3. 文件 4. “管道”,工作方式与实际管道相似:从一段输入,从另一端输出。 中原工学院信息商务学院毕业设计(论文)译文专用纸 3 5. 一个由其他种类的流组成的序列,以便我们可以将它们收集合并到某一单一的流内。 6. 其他数据源,如 Internet 连接等。 每一种数据源都有相应的 InputStream 子类。另外, FilterInputStream 也属 于一种 InputStream,为“ decorator”类提供基类,其中“ decorator”类可以把属性或者有用的借口与输入流连接在一起。 Output
6、Stream 类型 这部分包含的类决定了我们要输出到什么地方:字节数组(非字符串,并假设我们可以用字节数组创建一个)、文件或管道。 另外, FilterOutputStream 为 “ 修饰器( decortor) ” 类提供了一个基类,“ 修饰器 ” 类把属性或者有用的接口与输出流连接了起来。 添加 属性和有用的接口 利用层叠的数个对象为单个对象动态地和透明地添加职责的方式,称 作 “ 修饰器 ” 模式。(模式 1 是 Thinking in Patterns(用 java)中讨论的主题,见www.BruceE)。修饰器模式规定所有封装于初始对象内部的对象具有相同的接口。这使得修饰器的基本应用具有透明性 我们可以向修饰过或没有修饰过的对象发送相同的消息。这正是 Java I/O 类库里存在 “filter” 类的原因所在:抽象类 “filter” 是所有修饰类的基类。 修饰器必须具有和它所修饰的对象相同的接口,但是修饰器也可以扩展接口,这种情况发生在几种 “filter”类中)。