JAVA IO流之打印流 与 装饰者模式

打印流

PrintStream

为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。

构造方法:

PrintStream(File file) 接收文件
PrintStream(OutputStream out) 字节输出流
PrintStream(String fileName) 文件路径

PrintWriter

向文本输出流打印对象的格式化表示形式。
PrintWriter(File file) 接收文件
PrintWriter(OutputStream out) 字节输出流
PrintWriter(String fileName) 文件路径

作用:

  1. 只能作为数据的目的地
  2. 可以把数据原样输出
  3. 永远不会抛出IO异常 但是可以抛出其他异常 比如空指针
  4. 打印流类 相当于可以给其他流对象 装饰一个 原样输出的功能
System.in

是 BufferedInputStream 缓冲输入字节流
作用 接收 键盘输入的内容

System.out

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

代码示例:

public class Demo03 {
    public static void main(String[] args) throws IOException {     
//      fun1();
//      fun2();
        // 读取从键盘输入的数据
        InputStream in = System.in;
        int len = 0;
        StringBuilder sb = new StringBuilder();
        while (true) {
            if (sb.toString().endsWith("quit")) {
                break;
            }
            // 读取数据 拼接数据
            len = in.read();
                if (len == '\n') {
                    System.out.println(sb.toString());
                    sb.delete(0, sb.length());
                }else {
                    sb.append((char)len);
                }                   
            }
        }
    /**
     * @throws FileNotFoundException
     */
    public static void fun2() throws FileNotFoundException {
        // 打印字节流
        File file = new File("/Users/lanou/Desktop/level/001.txt");
        PrintWriter pw = new PrintWriter(file);
        pw.print("CLANNAD");
        pw.print(200);
        pw.print(false);
        pw.flush();
        pw.close();
    }

    /**
     * @throws FileNotFoundException
     */
    public static void fun1() throws FileNotFoundException {
        File file = new File("/Users/lanou/Desktop/level/001.txt"); 
        FileOutputStream fos = new FileOutputStream(file);
        // 创建缓冲字节输出流
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        // 创建一个打印字节流
        PrintStream ps = new PrintStream(bos);
        ps.println("CLANNAD");
        ps.print(true);
        ps.print(100);
        ps.print(3.5);
        ps.close();
    }
}

装饰者模式(设计模式)

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

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

代码举例:

public class Demo02 {
    public static void main(String[] args) throws IOException {
//      fun1();
        FileReader fr = new FileReader("/Users/lanou/Desktop/level/002.txt");
        WlLineNumberReader wl = new WlLineNumberReader(fr);
        String string ="";
        while ((string = wl.wlReader()) != null) {
            System.out.println(wl.getNum() + ": " +string);
        }
        wl.myClose();

    }

    /**
     * @throws FileNotFoundException 
     * @throws IOException
     */
    public static void fun1() throws FileNotFoundException, IOException {
        FileReader reader = new FileReader("/Users/lanou/Desktop/level/002.txt");
        LineNumberReader Line = new LineNumberReader(reader);
        String readLine = "";
        while ((readLine = Line.readLine())  != null) {

            int lineNumber = Line.getLineNumber();
            System.out.println(lineNumber +" "+ readLine);
        }
        Line.close();
    }
}

class WlLineNumberReader{
    // 把被装饰者 写成成员变量
    private Reader reader;
    private int num = 0;

    public WlLineNumberReader() {
        super();
        // TODO Auto-generated constructor stub
    }
    // 构造方法中传入被装饰者
    // 构造方法都是初始化成员变量的
    // 所以 被装饰者 应该是 本类的 成员变量
    public WlLineNumberReader(Reader reader) {
        super();
        this.reader = reader;
    }
    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    // 功能升级 从读字节 升级 到读行
    public String wlReader() throws IOException {
        num ++;
        int len = 0;
        StringBuffer buffer = new StringBuffer();
        while ((len = reader.read()) != -1) {
            if (len == '\n') {

                return buffer.toString();
            }else {
                 buffer.append((char)len);
            }
        }
        // 读完了 
        if (buffer.length() == 0) {
            return null;
        }
        return buffer.toString();
    }

    // 关闭资源
    public void myClose() throws IOException {
        reader.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值