Java语言采用流的机制实现输入/输出。所谓流,就是数据的有序排列,而流可以从某个源出来,到某个目的地去。
Java I/O库的两个设计模式
装饰模式:在InputStream、OutputStream、Reader和Writer代表的等级结构内部,有一些流处理器可以对其他流处理器起到装饰作用,形成新的、具有改善了功能了的流处理器。如图:
适配器模式:有一些流处理器是对其他类型的流的适配。
装饰模式的应用
为什么在I/O库中使用装饰模式
Java I/O 库需要很多功能的各种组合,如果这些功能都是用继承的方法实现,那么每一种组合都需要一个类,这样就会造成大量功能重复的类。
InputStream类型中的装饰模式:
InputStream有七个直接具体的子类,有四个属于FilterInputStream的具体子类,如下图:
上图中所有的类都叫做流处理器,根据输入流的源的类型,将这些类分成两种,即原始流类和链接流处理器。
原始流处理器:原始流处理器接收一个Byte数组对象、String对象、FileDescriptor对象等,并生成一个InputStream类型的流对象。包括以下四种:
ByteArrayInputStream:接收一个Byte数组作为流的源。
FileInputStream:接收一个File对象作为流的源。
StringBufferInputStream:接收一个String对象作为流的源。
链接流处理器:可以接收另一个同种类型的流对象作为流源,并对之扩展。它们都接收另一个InputStream对象作为流源。
BufferInputStream:从硬盘将数据读入到一个内存缓冲区,并从此缓存区提供数据。
DataInputStream:读取原始类型的数据。
LineNumberInputStream:带有计数功能的过滤输入流。
装饰模式的各个角色
抽象构件角色:InputStream扮演。这是一个抽象类,提供统一的接口。
具体构件角色:ByteArrayInputStream、FileInputStream等原始流扮演。
抽象装饰角色:FilterInputStream扮演。实现了InputStream接口。
具体装饰角色:DataInputStream、BufferedInputStream等。
半透明的装饰模式
理想的装饰模式在对装饰对象进行功能增强时,要求具体构件角色、装饰角色的接口与抽象构件的接口一致,而适配器模式并不要求对源对象的功能进行增强,但是会改变源对象的接口,以便和目标接口符合。
适配器模式的应用
ByteArrayInputStream是一个适配器类:继承了InputStream接口,而封装了一个byte数组,换言之,它将一个byte数组的接口适配成InputStream的接口。
从byte流到char流的适配
InputStreamReader是从byte输入流到char输入流的一个适配,下面是类的结构图。