Java装饰者模式(设计模式)与缓冲字符输入流(LineNumberReader)和打印流

一、装饰者模式

1.定义:一种思想,通过装饰,对原来功能进行升级
2.装饰者模式流程
a.把被装饰者,写成成员变量
b.构造方法中,给该成员变量赋值
c.对原有功能进行升级
3.继承也可以实现功能的升级,那么装饰者模式好处
a.高内聚(类中方法之间的联系--联系最后紧密)
b.低耦合(解耦)(类和类之前,尽量不要产生联系)
例题1:使用LineNumberReader
public static void fun1() throws FileNotFoundException, IOException {
    FileReader fr = new FileReader("/Users/lanou/Desktop/tes/znb.txt");
     LineNumberReader lnr = new LineNumberReader(fr);
     //设置行号
     lnr.setLineNumber(101);
    String string = "";
     while((string = lnr.readLine()) !=null) {
         System.out.println(lnr.getLineNumber()+":"+string);

     }lnr.close();
}
例题2:利用装饰者,实现LineNumberReader
public static void fun2() throws FileNotFoundException, IOException {
    //使用字节的类读取文件
     FileReader fr = new FileReader("/Users/lanou/Desktop/tes/znb.txt");
     wsLineNumberReader lnr  = new wsLineNumberReader(fr);
     // 设置行号
     lnr.setNum(100);
    //循环读取
     String string = "";
     while((string = lnr.myRead())!=null) {
         System.out.println(lnr.getNum()+":"+string);
     }
     lnr.myClose();
}

class wsLineNumberReader {
    //将被修饰这写成成员变量
    private  Reader  reader;
    //记录行号
    private int num = 0;
    public wsLineNumberReader() {
        // TODO Auto-generated constructor stub
    }
    public wsLineNumberReader(Reader reader) {
        super();
        this.reader = reader;
    }

    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public String myRead() throws IOException {
        //方法走了几次,就是几行
        num++;
        //功能升级
       StringBuilder stringBuilder = new StringBuilder();
      //把读出的字节拼接成字符串
       int len = 0;

       while((len = reader.read())!=-1) {
           //进行拼接
           //遇到换行,这一行字符串,已经拼接完毕,返回就行
           if (len =='\n') {
            return stringBuilder.toString();

        }else {
            //不换行就拼接字符串
            stringBuilder.append((char)len);
        }
       }
       //如果stringBuilder等于0,
       //读完了,没什么可拼接的
      if(stringBuilder.length()==0) {
          return null;
      }
      return stringBuilder.toString();
    }
    //关闭资源
    public void myClose() throws IOException {
        reader.close();
    }

}

二、打印流(只能输出-原样输出)

1.PrintStream--字节打印流
构造方法可接受的参数:
a.文件
b.字节输出流(OutputStream)
c.文件路径
2.PrintWriter--字符打印流

3.特点
a.只能作为数据的目的地
b.可以把数据原样输出
c.永远不会抛出IO异常,但会抛出其他异常
d.相当于Print打印流类,可以给其他流类对象,装饰一个原样输出的功能
例题1public static void fun1() throws FileNotFoundException {
    //创建文件
     File file =new File("/Users/lanou/Desktop/tes/haha.txt");
     //创建一个缓冲字节输出流
     FileOutputStream fos = new FileOutputStream(file);

     BufferedOutputStream bos = new BufferedOutputStream(fos);
     //创建打印流
     PrintStream ps = new PrintStream(bos);
//   调用写字符串的方法
     ps.println("wanglong");
     ps.println(true);
     ps.println(100);
     ps.println(3.5);
     ps.println("p");
     ps.write(100);
     ps.close();
}
例题2:    打印字符流
public static void fun2() throws FileNotFoundException {

        //创建文件
             File file =new File("/Users/lanou/Desktop/tes/haha.txt");
             //创建一个缓冲字节输出流
             FileOutputStream fos = new FileOutputStream(file);

            PrintWriter pw = new PrintWriter(fos);
            pw.println("nihao");
            pw.println(11);
            pw.println(true);
            pw.write(78);

            pw.flush();
            pw.close();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值