天天看点

JAVA高级应用之装饰者模式 LineNumberReader 打印流

装饰者模式

思想:可以通过装饰 对原来的功能进行升级

BufferedOutputStream
需要OutputStream参数进行构造
可以是FileOutputStream
相当于装饰后 功能得到提升 写入效率提高

ObjectOutputStream 
需要OutputStream参数进行构造
可以是FileOutputStream
装饰后 功能提升了,可以写对象了

装饰者模式流程
把被装饰者写成成员变量
构造方法中 给该成员变量赋值
对原有功能升级

装饰者模式的好处:
高内聚(类中方法直接的联系--联系最好紧密)
低耦合(解耦)(类与类直接尽量不要产生联系)
           

代码示例

package com.lanou3g.o03;

public class Demo06 {
    public static void main(String[] args) {
        MyStudent myStudent = new MyStudent(new Student1());
        myStudent.code();       
    }
}
interface Coder{
    public abstract void code();
}
class Student1 implements Coder{
    @Override
    public void code() {
        // TODO Auto-generated method stub
        System.out.println("会c语言");
        System.out.println("会c++语言");
        System.out.println("会c#语言");
    }
}
class MyStudent implements Coder{
    private Student1 student;
    public MyStudent() {
    }
    public  MyStudent(Student1 student) {
        this.student = student;
    }
    @Override
    public void code() {
        // TODO Auto-generated method stub
        student.code();
        System.out.println("会java");
        System.out.println("会js");
        System.out.println("会query");
    }

}
           

LineNumberReader

构造方法
LineNumberReader(Reader in)
参数为reader类的子类 比如FileReader  BufferedReader

普通方法:
int  getLineNumber() 获得当前行号
String  readLine()  读取文本行
void  setLineNumber(int lineNumber)  设置当前行号
           

代码示例

package com.lanou3g.o03;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;

import javax.annotation.processing.Filer;

public class Demo07 {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("/Users/lanou/Desktop/test3/ppp.txt");
        LineNumberReader lnr = new LineNumberReader(fr);
        String string = "";
        while((string = lnr.readLine()) != null) {
            int number = lnr.getLineNumber();
            System.out.println(number + string);
        }
        lnr.close();
    }
}
           

底层实现LineNumberReader()

package com.lanou3g.o03;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class Demo08 {
    public static void main(String[] args) throws IOException {
        FileReader fis = new FileReader("/Users/lanou/Desktop/test3/ppp.txt");
        MyLineNumber myLineNumber = new MyLineNumber(fis);
        String string = "";
        myLineNumber.setNum();
        while((string = myLineNumber.readLine1()) != null) {
            System.out.println(myLineNumber.getNum()  + string);
        }
        myLineNumber.MyClose();
    }
}
class MyLineNumber{
    private Reader reader;
    int num = ;
    public MyLineNumber() {

    }
    public MyLineNumber(Reader reader) {
        this.reader = reader;
    }

    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public String readLine1() throws IOException {
        StringBuilder sBuilder = new StringBuilder();
        num++;
        int len = ;
        while((len = reader.read()) != -) {
            if(len == ) {
                return sBuilder.toString();
            }else {
                sBuilder.append((char)len);
            }   
        }
        if(sBuilder.length() == ) {
            return null;        
        }
        return sBuilder.toString();
    }

    public void MyClose() throws IOException {
        reader.close();
    }
}
           

打印流(只能输出)

PrintStream(字节输出流)
构造方法可接收的参数:
文件(File)
字节输出流(OutputStream)
文件路径
PrintWriter(字符)
只能作为数据的目的地
可以把数据原样输出
永远不会抛出IO异常
  但是可以抛出其它异常 如空指针异常
打印流相当于给其它的流对象 装饰了一个原样输出的功能

System.in 是 BufferedInputStream 缓冲输入字节流
作用:接收键盘输入内容

Sytem.out 是 PrintStream 打印输出字节流
作用:输出内容到控制台
           

代码示例1:

public static void fun1() throws FileNotFoundException {
        // 创建文件
        File file =
                new File("/Users/lanou/Desktop/test/kkk.txt");
        // 创建缓冲字节输出流
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
        // 创建一个打印字节流
        PrintStream ps = new PrintStream(bos);
        // 写数据
        ps.println("网卡了");
        ps.println(true);
        ps.print();
        ps.write();
        ps.print('b');
        // 关闭资源
        ps.close();
    }

}
           

代码示例2:

public static void fun2() throws FileNotFoundException {
        // 打印字符流
        File file =
                new File("/Users/lanou/Desktop/test/kkk.txt");
        PrintWriter pw = new PrintWriter(file);
        pw.print("haha");
        pw.println();
        pw.println(false);
        // 刷新
        pw.flush();
        pw.close();
    }
           

代码示例3

package com.lanou3g.o03;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.io.PrintWriter;

public class Demo09 {
    public static void main(String[] args) throws IOException {
        InputStream in = System.in;
        StringBuilder sBuilder = new StringBuilder();
        while(true) {
            if(sBuilder.toString().endsWith("quit")) {
                break;
            }
            int len = ;
            if((len = in.read())!=  ) {
                sBuilder.append((char)len);
            }else {
                System.out.println(sBuilder.toString());        
            }
        }
    }
}
           

继续阅读