IO库设计模式.docx_第1页
IO库设计模式.docx_第2页
IO库设计模式.docx_第3页
IO库设计模式.docx_第4页
IO库设计模式.docx_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java I/O库的两个设计模式:Java的I/O库总体设计是符合装饰者模式(Decorator)跟适配器模式(Adapter)的。FileInputStream,FileOutputStream,DataInputStream及DataOutputStream都是流处理器的例子。装饰者模式:在由InputStream,OutputStream,Reader和Writer代表的等级结构内部,有一些流处理器可以对另一些流处理器起到装饰作用,形成新的,具有改善了的功能的流处理器。装饰者模式是Java I/O库的整体设计模式。这样的一个原则是符合装饰者模式的,如下图所示:适配器模式:在由InputStream,OutputStream,Reader和Writer代表的等级结构内部,有一些流处理器是对其它类型的流源的适配。这就是适配器模式的应用,如下图所示。适配器模式应用到了原始流处理器的设计上面,构成了I/O库所有流处理器的起点。三装饰模式的应用为什么不用继承而用装饰模式Java I/O库需要很多性能的各种组合,如果说这些性能的组合是通过继承方式来实现的话,那么每一种组合都需要一个类,这样就会出现大量重复性问题的出现,从而使类数目“爆炸”。而如果采用装饰模式,那么不仅类的数目大减少了,性能的重复也可以减至到最少。所以装饰模式是Java I/O库的基本模式。由于装饰模式的引用,造成了灵活性和复杂都大大增加了,必须理解Java I/O库是由一些基本的原始流处理器和围绕它们的装饰流处理器所组成的,这样可以在学习和使用Java I/O库时达到事半功倍的效果。首先是InputStream类型中的装饰模式:InputStream有七个直接的具体子类,有四个属于FilterInputStream的具体子类,如下图所示:上图中所有的类都叫做流处理器,这个图就叫做(InputStream类型的)流处理器图。根据输入流的源的类型,可以将这些流类分成两种,即原始流类(Original Stream)和链接流处理器(Wrapper Stream)。原始流处理器原始流处理器接收一个Byte数组对象,String对象,FileDiscriptor对象或者不同类型的流源对象,根据上面的图,原始流处理器包括以下四种:ByteArrayInputStream:为多线程的通信提供缓冲区操作功能,接收一个Byte数组作为流的源。FileInputStream:建立一个与文件有关的输入流。接收一个File对象作为流的源。PipedInputStream:可以与PipedOutputStream配合使用,用于读入一个数据管道的数据,接收一个PipedOutputStream作为源。StringBufferInputStream:将一个字符串缓冲区转换为一个输入流。接收一个String对象作为流的源。(帮助文档上说明:已过时。此类未能正确地将字符转换为字节。从1.1开始,从字符串创建流的首选方法是通过StringReader类进行创建。只有字符串中每个字符的低八位可以由此类使用。)链接流处理器所谓链接流处理器,就是可以接收另一个流对象作为源,并对之进行功能扩展的类。InputStream类型的链接处理器包括以下几种,它们都接收另一个InputStream对象作为流源。()FilterInputStream称为过滤输入流,它将另一个输入流作为流源。这个类的子类包括以下几种:BufferedInputStream:用来从硬盘将数据读入到一个内存缓冲区中,并从缓冲区提供数据。DataInputStream:提供基于多字节的读取方法,可以读取原始类型的数据。LineNumberInputStream:提供带有行计数功能的过滤输入流。PushbackInputStream:提供特殊的功能,可以将已经读取的字节“推回”到输入流中。()ObjectInputStream可以将使用ObjectInputStream串行化的原始数据类型和对象重新并行化。()SeqcueneInputStream可以将两个已有的输入流连接起来,形成一个输入流,从而将多个输入流排列构成一个输入流序列。抽象结构图按照上面的这种原始流处理器和链接流处理器的划分,可以用下面的结构图来描述它们之间的关系。上面的流处理器图跟装饰模式的结构图有着显而易见的相同之处。实际上InputStream类型的流处理器结构确实符合装饰模式。装饰模式结构图对于上图FilterInputStream查看JDK1.6源代码,部分代码如下:Java代码1. publicclassFilterInputStreamextendsInputStream2. protectedvolatileInputStreamin;3. 4. protectedFilterInputStream(InputStreamin)5. this.in=in;6. 7. /其它代码8. FilterInputStream继承了InputStream,也引用了InputStream,而它有四个子类,这就是所谓的Decorator模式。上面这个图向我们传达了这个信息:链接流对象接收一个原始流对象或者另外一个链接流对象作为流源;另一方面他们对流源的内部工作方法做了相应的改变,这种改变是装饰模式所要达到的目的。比如:BufferedInputStream“装饰”了InputStream的内部工作方式,使得流的读入操作使用了缓冲机制。在使用了缓冲机制后,不会对每一次的流读入操作都产生一个物理的读盘动作,从而提高了程序的效率,在汲及到物理流的读入时,都应当使用这个装饰流类。LineNumberInputStream和PushbackInputStream也同样“装饰”了InputStream的内部工作方式,前者使得程序能够按照行号读入数据;后者能够使程序读入的过程中,退后一个字符。DataInputStream子类读入各种不同的原始数据类型以及String类型的数据,这一点可以从它提供的各种read方法看出来,如:readByte(),readInt(),readFloat()等。 I/O库提供了四大等级结构:InputStream,OutputStream,Reader,Writer四个系列的类。InputStream和OutputStream处理8位字节流数据, Reader和Writer处理16位的字符流数据。InputStream和Reader处理输入, OutputStream和Writer处理输出。为了方便比较这几种类型,可以看看 I/O层次结构图:下面的图表示:以InputStream和OutputStream形成的层次关系下面的图表示:以Reader和Writer形成的层次关系四适配器模式的应用适配器模式是Java I/O库中第二个最为重要的设计模式。InputStream原始流处理器中的适配器模式,InputStream类型的原始流处理器是适配器模式的应用。ByteArrayInputStream是一个适配器类ByteArrayInputStream继承了InputStream的接口,而封装了一个byte数组。换言之,它将一个byte数组的接口适配成InputStream流处理器的接口。Java语言支持四种类型:Java接口,Java类,Java数组,原始类型(即int,float等)。前三种是引用类型,类和数组的实例是对象,原始类型的值不是对象。也即,Java语言的数组是像所有的其他对象一样的对象,而不管数组中所存储的元素类型是什么。这样一来的话,ByteArrayInputStream就符合适配器模式的描述,是一个对象形式的适配器类。FileInputStream是一个适配器类在FileInputStream继承了InputStrem类型,同时持有一个对FileDiscriptor的引用。这是将一个FileDiscriptor对象适配成InputStrem类型的对象形式的适配器模式。查看JDK1.6的源代码我们可以看到:Java代码1. publicclassFileInputStreamextendsInputStream2. 3. privateFileDescriptorfd;4. 5. privateFileChannelchannel=null;6. 7. publicFileInputStream(Filefile)throwsFileNotFoundException8. Stringname=(file!=null?file.getPath():null);9. SecurityManagersecurity=System.getSecurityManager();10. if(security!=null)11. security.checkRead(name);12. 13. if(name=null)14. thrownewNullPointerException();15. 16. fd=newFileDescriptor();17. open(name);18. 19. 20. /其它代码21. StringBufferInputStream继承了InputStream类型,同时持有一个对String对象的引用,这是一个将String对象适配成InputStream类型的对象形式的适配器模式。OutputStream原始流处理器中的适配器模式,同样地,在OutputStream类型中,所有的原始流处理器都是适配器类。ByteArrayOutputStream继承了OutputStream类型,同时持有一个对byte数组的引用。它一个byte数组的接口适配成OutputString类型的接口,因此也是一个对象形式的适配器模式的应用。FileOutputStream是一个适配器类FileOutputStream继承了OutputStream类型,同时持有一个对FileDiscriptor对象的引用。这是一个将FileDiscriptor接口适配成OutputStream接口形式的对象形适配器模式。Reader原始流处理器中的适配器模式,Reader类型的原始流处理器都是适配器模式的应用。StringReader是一个适配器类StringReader类继承了Reader类型,持有一个对String对象的引用。它将String的接口适 配成Reader类型的接口。从byte流到char流的适配在Java I/O库中,使用比较频繁的要数InputStreamReader,OutputStreamWriter这两种类了,InputStreamReader是从byte输入流到char输入流的一个适配器。当把InputStreamReader与任何InputStream的具体子类链接的时候,可以从InputStream的输出读入byte类型的数据,将之转换成为char类型的数据,如下图所示:查看JDK1.6的InputStreamReader源代码:Java代码1. publicclassInputStreamReaderextendsReader2. 3. privatefinalStreamDecodersd;4. 5. publicInputStreamReader(InputStreamin)6. super(in);7. try8. sd=StreamDecoder.forInputStreamReader(in,this,(String)null);9. /#checklockobject10. catch(UnsupportedEncodingExceptione)11. /Thedefaultencodingshouldalwaysbeavailable12. thrownewError(e);13. 14. 15. /其它代码16. 其中StreamDecoder是sun.nio.cs这个包里的一个类OutputStreamWriter是适配器类。Java代码1. 35publicclassStreamDecoderextendsReader2. 363. 58publicstaticStreamDecoderforInputStreamReader(InputStreamin,4. 59Objectlock,5. 60StringcharsetName)6. 61throwsUnsupportedEncodingException7. 628. 63Stringcsn=charsetName;9. 64if(csn=null)10. 65csn=Charset.defaultCharset().name();11. 66try12. 67if(Charset.isSupported(csn)13. 68returnnewStreamDecoder(in,lock,Charset.forName(csn);14. 69catch(IllegalCharsetNameExceptionx)15. 70thrownewUnsupportedEncodingException(csn);16. 7117. 18. /Exactlyoneoftheseisnon-null19. 225privateInputStreamin;20. 226privateReadableByteChannelch;21. 22722. 228StreamDecoder(InputStreamin,Objectlock,Charsetcs)23. 229this(in,lock,24. 230cs.newDecoder()25. 231.onMalformedInput(CodingErrorA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论