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


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

    节点流和处理流

    在这里插入图片描述

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

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

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

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

    在这里插入图片描述
    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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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(); 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    既然 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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

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

  • 相关阅读:
    Linux之J2EE的项目部署及发布
    Toronto Research Chemicals Oxamyl-13C3杀虫剂
    java网络通信
    Spring 面试题(注解、数据访问、AOP、MVC)
    MySQL运维2-主从复制
    PMP刷题小结
    当代博物馆中的3DGIS虚拟现实搭建
    分布式对象存储
    【限定词习题】all
    NC14 按之字形顺序打印二叉树
  • 原文地址:https://blog.csdn.net/Lov1_BYS/article/details/127931192