【Java】IO流 - 节点流和处理流【Buffered】

➤ Java 输入输出IO流 全部导航

节点流和处理流

在这里插入图片描述

  • 数据源就是存放数据的地方,可以是 文件、数组 等等;

    • 节点流是比较底层的,直接操作二进制数据
  • 包装流(处理流)是将节点流给包装了起来,更加灵活(相当于任意节点流,任意数据源都可)
    在这里插入图片描述
    BufferedReader里的Reader方法相当于把FileInputStream、FileReader等等给包装了起来,涵盖这些方法,可以是任意一个节点流(只要是Reader的子类就可以)

       同理 BufferedWriter也一样 (装饰器模式)
    

节点流和处理流一览:在这里插入图片描述

在这里插入图片描述
Reader是抽象父类,而FileInputStream、FileReader等等是实现方法的子类(节点流);BufferedReader是继承Reader的属性,然后把节点流给封装扩展起来,使用更便捷,不用区分文件、数组、字符等等。

  • BufferedReader和BufferedWriter属于字符流,都是按字符来读取数据的;
  • 真正工作的其实还是节点流而不是处理流,处理流只是做了一个封装;
  • 关闭处理流时,只需关闭最外层流(处理流)即可;

BufferedReader

  • 使用BufferReader读取文本文件,并显示在控制台;

使用 readLine() 按行读取:

public static void main(String[] args) throws Exception {
    String filePath = "d:\\HelloWorld.txt" ;//自行创建编辑
    //创建BufferedReader对象
    BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
    //读取
    String line;//按行读取,效率高
    /*
    说明:
        1.bufferedReader.readLine() 按行读取
        2.返回null时,表示文件读取完毕
     */
    while((line = bufferedReader.readLine()) != null){
        System.out.println(line);
    }
    //关闭流,只需关闭BufferedReader,因为底层的节点流会自动关闭
    bufferedReader.close();
}

BufferedWriter

public static void main(String[] args) throws IOException {
    String filePath = "d:\\note.txt";//创建空白文件
    //创建BufferedWriter对象
    BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath));//覆盖写入
    bufferedWriter.write("Hello!");               //需要追加就FileWriter(filePath,true)
    //插入一个和系统相关的换行
    bufferedWriter.newLine();
    bufferedWriter.write("Java!");
    bufferedWriter.newLine();
    bufferedWriter.write("祝你开心每一天~");
    //关闭外层流即可
    bufferedWriter.close();
}

Bufferd拷贝

public static void main(String[] args) throws Exception {
    /*
    说明:
        1.BufferedReader和BufferedWriter是安装字符操作
        2.不要去操作二进制文件,可能会造成损坏(例如音视频、doc、pdf)
     */
    String srcFilePath = "d:\\HelloWorld.txt";//提前创建
    String destFilePath = "d:\\hello.txt";//目标文件
    BufferedReader bufferedReader =null;
    BufferedWriter bufferedWriter =null;
    bufferedReader = new BufferedReader(new FileReader(srcFilePath));
    bufferedWriter = new BufferedWriter(new FileWriter(destFilePath));
    String line;
    while((line=bufferedReader.readLine())!=null) {
        bufferedWriter.write(line);
        bufferedWriter.newLine();
    }
    System.out.println("拷贝完毕");
    //关闭资源
    if(bufferedReader!=null) bufferedWriter.close();
    if(bufferedWriter!=null) bufferedWriter.close(); 
}

既然 BufferedReader/BufferedWriter 不能操作二进制文件,
那对于二进制文件,该采用什么方法呢?

BufferedInputStream/BufferedOutputStream

  • BufferedInputStream 是字节流 ,实现缓冲的输出流,可以将多个字节写入底层输出流中,而不必对每次字节写入调用底层系统。

音乐、视频的拷贝:

/*
演示使用BufferedInputStream和BufferedOutputStream拷贝
 */
public static void main(String[] args) throws Exception{
    String srcFilePath = "d:\\蜘蛛侠.jpg";
    String destFilePath = "d:\\spiderman.jpg";
    //创建BufferedInputStream和BufferedOutputStream对象
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFilePath));
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFilePath));
    //循环读取文件,并写入到destFilePath中
    byte[] buff = new byte[1024];
    int readLen = 0;
    //当返回-1时,表示文件读取完毕
    while((readLen = bis.read(buff))!=-1){
        bos.write(buff,0,readLen);
    }
    //关闭外层的处理流即可
    bis.close();
    bos.close();

字节流不仅仅可以操作二进制文件,还可以操作文本文件

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苗半里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值