zoukankan      html  css  js  c++  java
  • 详解 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(); //此处直接调用super方法就会执行被装饰者的read()方法,因为装饰者抽象类的read()方法中有语句this.InputStream.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方法将流关掉。
  • 相关阅读:
    手机微信浏览器手动清楚浏览器缓存
    CSS 图像精灵怎么用(css sprites定位技术) 图标定位
    电商平台应该分析哪些数据?具体怎么去分析?
    酷家乐装修方案
    字体识别(根据图片截图识别字体) 求字体
    酿造系列:自己酿造夏日饮用的低度甜酒好喝吗?如何酿造?
    xcode Xcode_9.2.xip 官方离线下载地址
    nginx给server增加日志配置
    用monit监控mongodb,崩溃后自动重启mongdb
    电商产品经理进阶一:电商基础流程
  • 原文地址:https://www.cnblogs.com/simpleDi/p/11343142.html
Copyright © 2011-2022 走看看