IO流——字符流 BufferedReader / BufferedWriter 进行文件读写

节点流、处理流

在这里插入图片描述

读文件:BufferedReader 的使用


package day06.reader;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

/**
 * @Author: Gin
 * @Description: 演示 BufferedReader 的使用
 * @Modified By: Gin
 * @Date: Created in 9:07 2021/9/3
 */
public class Demo {
    public static void main(String[] args) throws IOException {

        String filePath = "E:\\news3.txt";
        BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
        String line; // 按行读取,效率高
        // 1. BufferedReader.readLine() 是按行读取
        // 2. 当读取到 null 时,表示读取完成
        while((line = bufferedReader.readLine()) != null){
            System.out.println(line);
        }

        // 关闭流,这里只需要关闭 BufferedReader,因为底层会自动关闭节点流
        /*
            public void close() throws IOException {
                synchronized (lock) {
                    if (in == null)
                        return;
                    try {
                        in.close(); // 这里的 in,就是我们传入的 new FileReader(filePath)
                    } finally {
                        in = null;
                        cb = null;
                    }
                }
            }
         */
        bufferedReader.close();

    }
}


写文件:BufferedWriter 的使用


package day06.reader;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

/**
 * @Author: Gin
 * @Description:
 * @Modified By: Gin
 * @Date: Created in 9:19 2021/9/3
 */
public class Demo2 {
    public static void main(String[] args) throws IOException {

        String filePath = "E:\\news4.txt";
        
        // 1. new FileWriter(filePath, true):表示追加写
        // 2. new FileWriter(filePath):表示覆盖写
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath, true));
        bufferedWriter.write("Gin");
        // 插入一个换行
        bufferedWriter.newLine();
        bufferedWriter.write("Vodka");
        // 插入一个换行
        bufferedWriter.newLine();
        bufferedWriter.write("Vermouth");
        // 插入一个换行
        bufferedWriter.newLine();
        bufferedWriter.close();


    }
}


在这里插入图片描述

节点流

节点流可以从一个特定的数据源读写数据,如 FileReaderFileWriter。节点流是比较底层的流,直接操作数据源。例:

在这里插入图片描述

处理流

处理流(也叫包装流),是 “ 连接 ” 在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,也更加灵活,如 BufferedReaderBufferedWriter
在这里插入图片描述

  • 为了使处理流的功能更加强大,在处理流(包装流)的底层对 节点流 进行了封装:

  • BufferedReader 为例: BufferedReader 类中,有属性 Reader ,即:可以封装一个节点流,只要是 Reader 的子类即可,而 Reader 的子类有很多,这样一来就大大加强了流的功能。【这种设计模式称之为修饰器模式

  • 在这里插入图片描述

  • 在这里插入图片描述

  • BufferedWriter 同理

  • 在这里插入图片描述

  • 在这里插入图片描述

节点流和处理流的区别和联系

  1. 节点流是 底层流 / 低级流 ,直接跟数据源相接。
  2. 处理流(包装流)包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出。
  3. 处理流(包装流)对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连 【模拟修饰器设计模式】
  4. 模拟修饰器设计模式

字符流 BufferedReader / BufferedWriter 拷贝文本文件练习

字符流 BufferedReader / BufferedWriter 用来拷贝文本文件,拷贝二进制文件(图片、音乐、视频、压缩包等都是二进制文件)会出错!!!

package day06.reader;

import java.io.*;

/**
 * @Author: Gin
 * @Description: 利用处理流实现文件拷贝
 * @Modified By: Gin
 * @Date: Created in 9:31 2021/9/3
 */
public class CopyTest {
    public static void main(String[] args) {

        // 1. BufferedReader 和 BufferedWriter 是按照字符操作的
        // 2. 不要去操作二进制文件,可能造成文件损坏
        String srcFile = "E:\\imgs";
        String destFile = "E:\\imgs2";
        BufferedReader br = null;
        BufferedWriter bw = null;

        try {
            br = new BufferedReader(new FileReader(srcFile));
            bw = new BufferedWriter(new FileWriter(destFile));
            String line;
            while ((line = br.readLine()) != null){
                bw.write(line);
                bw.newLine();
            }
            System.out.println("拷贝完毕!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(br != null){
                    br.close();
                }
                if(bw != null){
                    bw.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }
}


字节流 BufferedOutputStream / BufferedInputStream 拷贝二进制文件

字节流既可以拷贝二进制文件,也可以拷贝文本文件

package day06.reader;

import java.io.*;

/**
 * @Author: Gin
 * @Description: BufferedOutputStream / BufferedInputStream 拷贝二进制文件
 * @Modified By: Gin
 * @Date: Created in 9:50 2021/9/3
 */
public class CopyTest2 {
    public static void main(String[] args) {

        String srcFile = "E:\\HBuilderX.3.1.22.20210709.zip";
        String destFile = "E:\\HBuilderX.3.1.22.20210709-2.zip";

        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;

        try {
            bis = new BufferedInputStream(new FileInputStream(srcFile));
            bos = new BufferedOutputStream(new FileOutputStream(destFile));
            byte[] buf = new byte[1024];
            int readLen;
            while((readLen = bis.read(buf)) != -1){
                bos.write(buf, 0, readLen);
            }
            System.out.println("拷贝完成!");

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try{
                if(bis != null){
                    bis.close();
                }
                if(bos != null){
                    bos.close();
                }
            }catch(IOException e){
                e.printStackTrace();
            }
        }


    }
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值