Java装饰与读取还有打印流

1.装饰者模式(设计模式)
1.可以对原来的的功能模式进行升级
BufferedOutPutStream 需要 OutPutStream构造 可以是FileOutPutStream
OBjectOutPutStream需要 OutPutStream构造 也可以是FileOutPutStream
2.装饰后功能升级 还可以写对象了
1.把被装饰者变成成员变量
2.构造方法中 给该成员变量赋值
3.对原有功能进行升级

3.其实继承也能达到这样的结果 name装饰者模式有啥好处
高内聚(类中方法直接的联系 ----联系最好紧密)
低耦合(解耦)(类和类之间 尽量不要产生联系)
2.装饰学生类变成蓝鸥学生对学生技能进行提升代码演示
public class text {

    public static void main(String[] args) {
         LOStudent loStudent = new LOStudent(new Student());//创建一个新的蓝鸥学生类
         loStudent.coder();//调用蓝鸥学生功能

    }

}
interface Coder{//1.创建功能编码器接口类
    public abstract void coder();//2.抽象接口类方法
}
class Student implements Coder{//3.学生类实现接口
    @Override
    public void coder() {//4.重写接口抽象类
        System.out.println("c语音");//5.实现内容,学生功能
        System.out.println("C++");
        System.out.println("C#");
    }   
}
class LOStudent implements Coder{//6.创建蓝鸥类链接接口
    private Student student;//7.创建一个学生
    public LOStudent() {

    }


    public LOStudent(Student student) {//8.构造方法传入学生类
        super();
        this.student = student;//9.利用构造方法将学生类包装成蓝鸥学生类
    }
    @Override
    public void coder() {
        student.coder();//10.调用装饰者原有的功能(第九步没有返回student还属于Student类型调用的coder直属Student)
        System.out.println("Java");//11.对原有功能进行升级
        System.out.println("HTML");
        System.out.println("Js");       
    }}

class LXStudent implements Coder{
        private Student dent;
        public LXStudent() {

        }
        public LXStudent(Student dent) {
            super();
            this.dent = dent;//将学生包装成蓝翔学生
        }
        @Override
        public void coder() {
        dent.coder();//调用原学生功能
        System.out.println("挖掘机");
        System.out.println("电竞");
        }

    }

2.LineNumberReader

1.特点: 能获取行号
2.利用装饰者模式实现 LineNumberReader
被装饰者 Reader
1.read()方法升级 读取
string Builder 进行字符串拼接
到遇到换行时 一行读取完毕\n 或者ASSCI 码表中的10
2.带行号
3.对关闭功能资源进行资源升级
2.LineNumberReader的简单实现
public class text {

    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("/Users/lanou/Desktop/Test/ppp.txt");//1.创建读取类读取文件路径(找不到会报错)
        LineNumberReader lnr = new LineNumberReader(fr);//2.创建换行读取类lnr传入要读取的读取类
        String string  = "";//3.初始化字符空间
        while ((string = lnr.readLine()) != null) {//4.读取换行读取类中的内容 内容为空时停止读取
            System.out.println(lnr.getLineNumber());//5.打印当前行的行数
            System.out.println(string);//6.打印当前行的内容
        }
        lnr.close();//关闭资源
    }
}
3.模仿换行读取
public class text {

    public static void main(String[] args) throws IOException {
//      fun1();//LineNumberReader简单实现
        FileReader fr = new FileReader("/Users/lanou/Desktop/Test/ppp.txt");//1.锁定读取目标文件
        Qunndam dam = new Qunndam(fr);//2.包装目标文件
        String string = "";//3.初始化字符阅读空间
        while ((string = dam.read()) != null) {//3.循环读取文件内容
            System.out.println(dam.getNumner() + ":" + string);
        }
        dam.Myclose();//4.关闭资源
    }

    /**
     * @throws FileNotFoundException
     * @throws IOException
     */
    private static void fun1() throws FileNotFoundException, IOException {
        FileReader fr = new FileReader("/Users/lanou/Desktop/Test/ppp.txt");//1.创建读取类读取文件路径(找不到会报错)
        LineNumberReader lnr = new LineNumberReader(fr);//2.创建换行读取类lnr传入要读取的读取类
        String string  = "";//3.初始化字符空间
        while ((string = lnr.readLine()) != null) {//4.读取换行读取类中的内容 内容为空时停止读取
            System.out.println(lnr.getLineNumber());//5.打印当前行的行数
            System.out.println(string);//6.打印当前行的内容
        }
        lnr.close();//关闭资源
    }
}
class Qunndam{
    private int numner = 0;//行数
    private Reader reader;//1.把被装饰者写成成员变量
    public Qunndam() {

    }
    public int getNumner() {
        return numner;
    }
    public void setNumner(int numner) {
        this.numner = numner;
    }

    public Qunndam(Reader reader) {
        super();
        this.reader = reader;
    }
    public String read() throws IOException {
        numner ++;
        StringBuffer  stringBuffer = new StringBuffer();//创建一个字符缓存区
        String string = "";
        int len = 0;
        while ((len = reader.read()) != -1) {
            if (len == 10) {
                //拼接字符串 
                //遇到换行 这一行字符串 已经拼接完毕 直接返回就行
                return stringBuffer.toString();

            }else {
                stringBuffer.append((char)len);//将读取的的内容存入字符缓存区拼接
            }}
            if (stringBuffer.length() == 0) {//读完了没有内容可以拼了
                return null;
            }
            return stringBuffer.toString();//返回拼接内容
    }

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

}

2.打印流(只能输出)

1.PrintStream(字节)
2.PrintWriter(字符)
构造方法可接受
1.文件(File)
2.字节输出流(OutPutStream)
3.文件路径
1.只能作为数据的目的地
2.可以吧数据原样输出
3.永远不会抛出IO异常 例如空指针
4.打印流 相当于可以给出其他的流对象装饰一个 原样输出的功能

System.out 是 PrintStream 打印输出字节流
作用:输出内容到控制台
3.测试打印流功能
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;

public class text {
  public static void main(String[] args) throws FileNotFoundException {
File file = new File("/Users/lanou/Desktop/test/kkle.txt");//1.创建文件
FileOutputStream fos = new FileOutputStream(file);//2.创建文件写入流
BufferedOutputStream bos = new BufferedOutputStream(fos);//3.创建高效流高效写入流
PrintStream ps = new PrintStream(bos);//4.创建打印流向目标文件打印内容
ps.println("哈哈哈");//打印字符串
ps.print(true);//打印布尔类
ps.print(3.5);//打印浮点类型
ps.print(100);//打印数字
ps.write(100);//写入字符
ps.print('p');//打印字符
ps.close();
}
}
4.测试打印写入流
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;

public class text {
  public static void main(String[] args) throws FileNotFoundException {
      File file = new File("/Users/lanou/Desktop/test/kke.txt");//1.创建文件
      PrintWriter pw = new PrintWriter(file);//2.创建打印写入流输入文件
      pw.println("哈哈哈");//写入字符串
      pw.println(200);//写入数值
      pw.println(false);//写入布尔类
      pw.flush();//刷新
      pw.close();//关闭资源
}
}
4.模仿Scanner类键盘输入打印功能
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class text {
  public static void main(String[] args) throws IOException {
  System.out.println("请输入内容");
  InputStream in = System.in;//1.接收键盘内容
  StringBuffer stringBuffer = new StringBuffer();//2.创建字符串缓存区
  int len = 0;//3.初始化读取内容
   while (true) {
    if (stringBuffer.toString().equals("quit")) {
        break;//4.输入quit停止运行
    }
    len  = in.read();//4.读取键盘内容
    if (len == 10) {//换行
        System.out.println(stringBuffer.toString());
        stringBuffer.delete(0, stringBuffer.length());

    }else {
        stringBuffer.append((char)len);
    }
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值