详解 Java I/O 与装饰者模式

Posted simpledi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解 Java I/O 与装饰者模式相关的知识,希望对你有一定的参考价值。

1、I/O分类与装饰者模式

基本java I/O包含两种类型的流,字节流(inputStream、outputStream)与字符流(Writer,Reader),关于I/O操作类的设计,用到了装饰者模式,如下图所示。

其中FilterInputStream抽象类继承了InputStream抽象类,并且组合了InputStream类。

 

技术图片

public class UpperCaseInputStream extends FilterInputStream  //继承InputStream

//组合InputStream
protected UpperCaseInputStream(InputStream in) super(in);   //重写方法  @Override public int read() throws IOException int c=super.read(); return (c==-1?c:Character.toUpperCase(c)); public static void main(String[] args) throws IOException int c;
//使用时,仅需要将被装饰者作为参数,构建装饰者对象即可 InputStream in
=new UpperCaseInputStream(new FileInputStream("D:\\\\JAVAworkspace\\\\ProgramTest\\\\src\\\\StreamDemo.java")); try while((c=in.read())>=0) System.out.print((char)c); finally in.close();

装饰者模式的使用场景:

(1)扩展后者附加另一个类的功能,可以随时撤销这个功能(不进行装饰),灵活性高。

(2)几种功能的随机组合叠加使用次数频繁时。(叠加使用装饰者类即可)

2、字节流与字符流的区别

  • InputStream,outputstream是所有字节流的基类,reader和writer是所有字符流的基类。在硬盘或者网络传输中最小的存储单元都是字节,但是在程序操作中常用字符。二者可以通过编解码的方式进行转换,当编解码方式不一致的情况下,就会出现乱码问题。
  • 字符流操作时使用了缓冲区,字节流没有。在关闭字符流时会强制性地将缓冲区中的内容进行输出,但是如果没有关闭,则缓冲区中的内容是无法输出的。
  • 但是可以使用flush()函数对其进行强制输出。或者在java7之后有自动关闭资源新特性,将创建流对象的代码放到try小括号里面,会自动调用流对象的close方法将流关掉。

以上是关于详解 Java I/O 与装饰者模式的主要内容,如果未能解决你的问题,请参考以下文章

装饰者模式

装饰者模式

装饰者模式

代理模式、装饰者模式

设计模式中巧记I/O

设计模式之装饰者模式