在所有的链接流处理器中,最常见的就是FilterOutputStream类。以这个类为核心的装饰模式结构非常明显和典型,如下图:

java中IO用到的设计模式 java io流两种设计模式_数据

装饰模式所涉及的各个角色:

抽象构件(Component)角色:由OutputStream扮演,这是一个抽象类,为各种的子类型流处理器提供统一的接口。

具体构件(Concrete Component)角色:由ByteArrayOutputStream、FileOutputStream、PipedOutputStream等扮演,它们均实现了OutputStream所声明的接口。

抽象装饰(Decorator)角色:由FilterOutputStream扮演,它与OutputStream有相同的接口,而这正是装饰类的关键。

具体装饰(Concrete Decorator)角色:由几个类扮演,分别是BufferedOutputStream、DateOutputStream、以及PrintStream。

所谓链接流,就是装饰模式中的装饰角色,原始流就是具体构件角色。与

DateInputStream相对应的是DataOutputStream,后者负责将由原始数据类型和String对象组成的数据格式化,并输出到一个流中,使得任何机器上的任何DataInputStream类型的对象都可以读入这些数据。所有的方法都是以write开始。

如果需要对数据进行真正的格式化,以便输出到像控制台显示那样,那就需要使用PrintStream。PrintStream可以对由原始数据类型和String对象组成的数据进行格式化,以形成可以阅读的格式;而DataOutputStream则不同,它将数据输出到一个流中,以便DataInputStream可以在任何机器而后操作系统中都可以重新将数据读入,并进行结构重建。PrintStream对象最重要的两个方法是print() 和println(),这两个方法都是重载的,以便可以打印出所有使用类型的数据。这两个方法之间的区别是后者每行结束时多打印出一个换行符号。

BufferedOutputStream对一个输出流进行装饰,使得流的写出操作使用缓冲机制。在使用缓冲机制后,不会对每一次的流的写入操作都产生一

个物理的写动作,从而提高的程序的效率。在涉及到物理流的地方,比如控制台I/O、文件I/O等,都应当使用这个装饰流处理器。

Reader类型中的装饰模式

在Reader类型的流处理器中,原始流处理器包括以下四种:

(1)CharArrayReader:为多线程的通信提供缓冲区操作功能。

(2)InputStreamReader:这个类有一个子类--FileReader。

(3)PipedReader:可以与PipedOutputStream配合使用,用于读入一个数据管道的数据。

(4)StringReader:建立一个与文件有关的输入流。

链接流处理器包括以下:

(1)BufferedReader:用来从硬盘将数据读入到一个内存缓冲区,并从此缓冲区提供数据,这个类的子类为LineNumberReader。

(2)FilterReader:成为过滤输入流,它将另一个输入流作为流的来源。这个类的子类有PushbackReader,提供基于多字节的读取方法,可以读取原始数据类型的数据,Reader类型的类图如下所示:

java中IO用到的设计模式 java io流两种设计模式_流处理_02

Reader类型中,装饰模式所涉及的各个角色:

(1)抽象构建(Component)角色:有Reader扮演。这是一个抽象类,为各种的子类型流处理器提供统一的接口。

(2)具体构建(Concrete Component)角色:由CharArrayReader、InputStreamReader、PiPedReader、StringReader等扮演,他们均实现了Reader所声明的接口。

(3)抽象装饰(Decorator)角色:由BufferedReader和FilterReader扮演。这两者有着与Reader相同的接口,它们

分别给出两个装饰角色的等级结构,第一个给出LineNumberReader作为具体装饰角色,另一个给出PushbackReader

作为具体装饰角色。

(4)具体装饰(Concrete Decorator)角色:LineNumberReader作为BufferedReader的具体装饰角色,BufferedReader作为FilterReader的具体装饰角色。

如下图所示,标有聚合连线的就是抽象装饰角色:

java中IO用到的设计模式 java io流两种设计模式_子类_03

Writer类型中的装饰模式

Writer类型是一个与Reader类型平行的等级结构,而且Writer类型的等级结构几乎与Reader的等级结构关于输入/输出是对称的。如图所示:

java中IO用到的设计模式 java io流两种设计模式_数据_04

在Writer类型的流处理器中,原始流处理器包括以下四种:

(1)CharArrayWriter:为多线程的通信提供缓冲区的操作功能。

(2)OutputStreamWriter:建立一个与文件有关的输出流。含有一个具体子类FileWrite,为Write类型的输出流提供文件输出功能。

(3)PipedWriter:可以和PipedOutputStream配合使用,用于读如果一个数据管道的数据。

(4)StringWriter:想一个StringBuffer写出数据。

链接流处理器包括以下三种:

(1)BufferedWriter:为Writer类型的流处理器提供缓冲区功能。

(2)FilterWriter:称为过滤输入流,它将另一个输入流作为流的来源。这是一个没有子类的抽象类。

(3)PrintWriter:支持格式化的文字输出。

Writer类型中,装饰模式所涉及的各个角色:

(1)抽象构建(Component)角色:由Write扮演。这是一个抽象类,为为各种子类型的流处理器提供统一的接口。

(2)具体构建(Concrete Component):角色由CharArrayWriter、OutputStreamWriter、

PipedWriter、StringWriter扮演,它们实现了Writer所声明的接口。

(3)抽象装饰(Decorator)角色:由BufferedWriter、FilterWriter、PrintWriter扮演,它们有着与Write

相同的接口。

(4)具体装饰(Concrete Decorator)角色:与抽象装饰角色合并。

如下图所示,标出了从抽象装饰角色到抽象构件角色的聚合连线,更易于与装饰模式的结构图比较。

java中IO用到的设计模式 java io流两种设计模式_数据_05

适配器模式的应用适配器模式是java I/O库中第二个最重要的设计模式。

InputStream原始流处理器中的适配器模式

InputStream类型的原始流处理器是适配器模式的应用。

ByteArrayInputStream是一个适配器类 。ByteArrayInputStream继承了InputStream的接口,而封装了一个byte数组。换而言之,它将一个byte数组的接口适配成了InputStream流处理器的接口。java语言支持四种类型:java类、java接口、java数组和原始类型。前三章是引用类型,类和数组的实例都是对象,原始类型的值不少对象。

java语言的数组是像所有其他对象一样的对象,而不管数组中所存放的元素的类型是什么。这样一来,ByteArrayInputStream就符合适配

器模式的描述,而且是一个对象形式的适配器类。如下图所示:

java中IO用到的设计模式 java io流两种设计模式_子类_06

StringBufferInputStream是一个适配器类。StringBufferInputStream继承了InputStream类型,同时持有一个对String类型的引用。这是将String对象适配成InputStream类型的对象形式的适配器模式,如下图:

java中IO用到的设计模式 java io流两种设计模式_java中IO用到的设计模式_07

OutputStream原始流处理器中的适配器模式