Java之打印流、装饰者模式以及LineNumberReader的使用

装饰者模式(设计模式)

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

例如:BufferedOutputstream
        需要Outputstream构造
            可以使FileOutputStream(被装饰者)功能得到提升 相当于装饰后,写入效率提高了

    ObjectOutputstream
        需要Outputstream构造
            可以使FileOutputStream被装饰后功能提升,即可以写对象

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

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

代码示例:
        public class Demo01 {
            public static void main(String[] args) {
                LOStudent student = new LOStudent(new Student());
                student.code();
                LXStudent student2 = new LXStudent(new Student());
                student2.code();
            }
        }

        // 学习写代码
        interface Coder{
            public abstract void code();
        }
        // 学生实现这个接口
        // 学生是被装饰者
        class Student implements Coder{

            @Override
            public void code() {
                System.out.println("c");
                System.out.println("c++");
                System.out.println("c#");
            }   
        }

        // 进行包装
        class LOStudent implements Coder{
            private Student student;
            // 构造方法中传入被装饰者
            // 构造方法都是初始化成员变量的
            // 所以被装饰者应该是本类的成员变量
            public LOStudent() {}

            public LOStudent(Student student) {
                super();
                this.student = student;
            }

            // 进行学习代码
            @Override
            public void code() {

                // 调用被装饰者的原有功能
                student.code();
                // 对功能的升级
                System.out.println("java");
                System.out.println("html");
                System.out.println("js");
            }   
        }

        // 进行包装
        class LXStudent implements Coder{
            private Student student;

            public LXStudent() {    }

            public LXStudent(Student student) {
                super();
                this.student = student;
            }

            @Override
            public void code() {
                student.code();
                System.out.println("电竞");
                System.out.println("汽修");
                System.out.println("挖掘机");
            }   
        }

LineNumberReader

特点:能获取行号

代码示例:
        FileReader fr = new FileReader("/Users/lanou/Desktop/test/ppp.txt");
        LineNumberReader lnr = new LineNumberReader(fr);
        String len = "";
        while ((len = lnr.readLine()) != null) {
            System.out.println(lnr.getLineNumber() + ":" + len);
        }
        lnr.close();

利用装饰者实现LineNumberReader

        class MyLineNumberReader {
            private Reader reader;

            // 记录行号
            private int num = 0;

            public int getNum() {
                return num;
            }
            public void setNum(int num) {
                this.num = num;
            }
            public MyLineNumberReader() {
            }
            public MyLineNumberReader(Reader reader) {
                super();
                this.reader = reader;
            }
            // 功能升级 从读字节 升级到读行
            public String myRead() throws IOException {
                // 方法走一次 就代表读了一行
                num++;
                StringBuilder stringBuilder = new StringBuilder();
                int len = 0;
                while ((len = reader.read()) != -1) {
                    if (len == 10) {
                        // 遇到换行
                        return stringBuilder.toString();

                    } else {
                        stringBuilder.append((char)len);
                    }
                }
                if (stringBuilder.length() == 0) {
                    return null;
                }
                return stringBuilder.toString();
            }
            // 关闭资源
            public void myClose() throws IOException {
                reader.close();
            }
        }

        public static void main(String[] args) throws IOException {
            // 使用字节的类 读取文件
            FileReader fr = new FileReader("/Users/lanou/Desktop/test/ppp.txt");
            MyLineNumberReader mnr = new MyLineNumberReader(fr);
            // 设置行数
            mnr.setNum(100);
            String len = "";
            while ((len = mnr.myRead())!=null) {
                System.out.println(mnr.getNum() + len);
            }
            mnr.myClose();
        }

打印流

PrintStream(字节)
构造方法可接受的参数:
    1.文件(File)
    2.字节输出流(OutputStream)
    3.文件路径

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

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

System.out 是PrintStream 打印输出字节流
作用:输出内容到控制台
    public static void main(String[] args) throws IOException {
        // 创建文件 打印字节流 "/Users/lanou/Desktop/test/ppp.txt"
        File file = new File("/Users/lanou/Desktop/test/ppp.txt");
        // 缓冲字节输出流
        FileOutputStream fos = new FileOutputStream(file);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        PrintStream ps = new PrintStream(bos);
        // 写数据
        ps.println("hahaha");
        ps.println(true);
        ps.print(100);
        ps.print(3.5);
        ps.write(100);
        ps.println('p');
        // 关闭资源
        ps.close();
    }
    public static void main(String[] args) throws IOException {
        // 打印字符流
        File file = new File("/Users/lanou/Desktop/test/ppp.txt");
        PrintWriter pw = new PrintWriter(file);
        pw.println("hah");
        pw.println(100);
        pw.print(true);
        pw.flush();
        pw.close();
    }
    public static void main(String[] args) throws IOException {

        System.out.println("请输入");
        // 读取从键盘输入的数据
        InputStream in = System.in;
        // 拼接字符串
        StringBuilder stringBuilder = new StringBuilder();
        while (true) {
            if (stringBuilder.toString().endsWith("quit")) {
                break;
            }
            // 读取数据  拼接数据
            int len = in.read();
            if (len == 10) {
                System.out.println(stringBuilder.toString());
                stringBuilder.delete(0, stringBuilder.length()); 
            } else {
                stringBuilder.append((char)len);
            }
        }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值