JavaIO流03_节点流和处理流(重点)

JavaIO流_节点流和处理流(重点)

  • 节点流是底层流,直接跟数据源相连
  • 处理流(包装流)包装节点流,既可以消除不同节点流的是实现差异,亦可以提供方便的方法来完成输入输出(源码理解)
  • 处理流对节点流进行包装,使用修饰器设计模式,不会直接与数据源相连
  • 处理流的功能更主要体现在以下两个方面:
    • **1.性能的提高:**主要以增加缓存的方式来提高输入的效率
    • **2.操作的便捷:**处理流可能提供了一系列便捷的方法来一次输入输出大批数据,使用更加灵活方便
  • 结论,真正工作的是节点流,处理流是利用多态和动态绑定来实现便捷功能的,因此只需要外层流,即关闭处理流底层会自动关闭节点流
  • BufferedReader尽量处理文本文件,二进制文件可能会丢失!

BufferedReader

如何理解处理流呢?
这里我们自己创建节点流和处理流的类来模拟处理流的作用

处理流传入一个节点流,对节点流操作基础上进行扩列

package com.wjs.BufferedRW;

/**
 * 搞清为什么要使用处理流
 * 模拟处理流
 */
//下划线来区分已存在的方法
//抽象类
abstract class Reader_{
    //子类可以使用这个公有方法,当子类的实例调用此方法时,如果在子类中没有覆盖,那么java的动态绑定机制会自动寻找到父类的此方法。
    //还有就是抽象类别跟接口混了,实现接口的类必须实现接口定义的所有方法。
    public void fileReader(){}
    public void stringReader(){}
    /**
     * 可以使用一个read抽象方法来统一管理
     */
//    abstract void read();
}

//节点流01
class fileRead_ extends Reader_{
    @Override
    public void fileReader(){
        System.out.println("文件已读入......");
    }
}

//节点流02
class stringRead_ extends Reader_{
    @Override
    public void stringReader(){
        System.out.println("字符串已读入......");
    }
}

//处理流
public class BufferedReader01 extends Reader_{
    private Reader_ reader_;
    //构造函数
    public BufferedReader01(Reader_ reader_) {
        this.reader_ = reader_;
    }

    //扩展
    //读写多次,或者加入缓存
    public void writefiles(int n){
        for(int i=1;i<=n;i++) reader_.fileReader();
    }


    public static void main(String[] args) {

        new BufferedReader01(new fileRead_()).writefiles(10);

    }

}
当然java中以及存在BufferedReader类和其中的功能,来模拟读入操作
  • 需要注意按行读取返回null表示读取结束
  • 关闭流,只需要关闭bufread,底层会自动关闭节点流
public static void read01() throws IOException {
    String filePath = "C:\\Users\\Laity\\Desktop\\Java全栈\\JavaIO\\Test文件\\hello.txt";

    //直接抛出异常
    BufferedReader bufread = new BufferedReader(new FileReader(filePath));

    String line;//按行读取
    while((line=bufread.readLine())!=null){
        System.out.println(line);
    }

    //关闭流,只需要关闭bufread,底层会自动关闭节点流
    bufread.close();
}

BufferedWriter

  • buf.newLine(); //换行符
public static void write01() throws IOException {
    String filePath = "C:\\Users\\Laity\\Desktop\\Java全栈\\JavaIO\\Test文件\\bufwriter.txt";

    BufferedWriter buf = new BufferedWriter(new FileWriter(filePath,true));

    buf.write("处理流真简单!");
    buf.newLine();//换行符
    System.out.println("\nsuccess write...");

    buf.close();
}

CopyFile练习

  • 是按字符操作,不要操作二进制文件,会造成复制后的文件损坏(声音,视频,word,pdf等)
public static void copy() throws IOException {
    String filePath_in = "C:\\Users\\Laity\\Desktop\\Java全栈\\JavaIO\\Test文件\\hello.txt";
    String filePath_out = "C:\\Users\\Laity\\Desktop\\Java全栈\\JavaIO\\Test文件\\bufHelloCopy.txt";

    BufferedReader bufread = null;
    BufferedWriter bufwrite = null;
    try {
        bufread = new BufferedReader(new FileReader(filePath_in));
        bufwrite = new BufferedWriter(new FileWriter(filePath_out,true));
        String line;
        while((line=bufread.readLine())!=null){
            bufwrite.write(line);
            bufwrite.newLine();
        }

        System.out.println("copy success...");

    } catch (IOException e) {
        e.printStackTrace();
    }

    if(bufwrite!=null) bufwrite.close();
    if(bufread!=null) bufread.close();

}

BufferedInputStream

BufferedOutputStream

BufferedInputStream 和 BufferedOutputStream 使用类似,直接拿复制图片的模板来了

public static void copy() throws IOException {

    String filePath_in = "C:\\Users\\Laity\\Desktop\\Java全栈\\JavaIO\\Test文件\\01.png";
    String filePath_out = "C:\\Users\\Laity\\Desktop\\Java全栈\\JavaIO\\Test文件\\bufcopy.png";

    BufferedInputStream bufin = null;
    BufferedOutputStream bufout = null;
    try {
        bufin = new BufferedInputStream(new FileInputStream(filePath_in));
        bufout = new BufferedOutputStream(new FileOutputStream(filePath_out));
        byte[] buf = new byte[1024];
        int readLen = 0;
        while((readLen=bufin.read(buf))!=-1){
            bufout.write(buf,0,readLen);
        }
        System.out.println("copy success...");

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }finally {
        if(bufin!=null) bufin.close();
        if(bufout!=null) bufout.close();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值