BufferReader/BufferWriter使用时出现的问题

项目场景:

`
在一个文件中有一些数据,需要读取出来并替换成其他字符再写回文件中,需要用Buffer流。


问题描述

文件中的数据丢失,并且在读取前就为空,读取不到数据。
问题代码:

File f = new File("D:\\我的青春谁做主.txt");
        FileReader fr = new FileReader(f);
        BufferedReader br = new BufferedReader(fr);
        FileWriter fw = new FileWriter(f);
        BufferedWriter bw = new BufferedWriter(fw);
        StringBuffer str = new StringBuffer();

        String line = br.readLine();
        while (line != null){
            str.append(line);
            line = br.readLine();
        }
        System.out.println("替换前:" + str.toString());
        String newStr = str.toString().replace("{name}", "欧欧");
        String str1 = newStr.replace("{type}", "狗狗");
        String str2 = str1.replace("{master}", "风扇");
        System.out.println("替换后:" + str2);
        bw.write(str2);
        if (bw != null){
            bw.close();
        }
        if (br != null){
            br.close();
        }

过程DEBUG:

在这里插入图片描述
在这里我们看到在读取的过程就line的值为null


原因分析:

1.可能是因为读写的顺序反了?不合理,我的需求是将文件中数据读取出来并替换
2.可能是缓冲流的缓冲区的内存原因,在BufferWriter打开的时候将BufferReader的缓冲区替换掉了,所以读取不出来数据。


解决方案:

验证猜想:在用之前将流对象的值设为null,在需要使用的时候再进行实例化。
改后代码:

File f = new File("D:\\我的青春谁做主.txt");
        FileWriter fw = null;
        BufferedWriter bw = null;
        FileReader fr = null;
        BufferedReader br = null;
        StringBuffer str = new StringBuffer();
        try {
            fr = new FileReader(f);
            br = new BufferedReader(fr);
            String line = br.readLine();
            while (line != null) {
                str.append(line);
                line = br.readLine();
            }
            System.out.println(str.toString());
            System.out.println("替换前:" + str.toString());
            String newStr = str.toString().replace("{name}", "欧欧");
            String str1 = newStr.replace("{type}", "狗狗");
            String str2 = str1.replace("{master}", "风扇");
            System.out.println("替换之后:" + str2);
            fw = new FileWriter(f);
            bw = new BufferedWriter(fw);
            bw.write(str2);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (bw != null){
                try {
                    bw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

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

运行结果:
在这里插入图片描述
证明假说成立,所以在用到缓冲流的时候要注意缓冲区,不能同时打开两个流,否则会被后打开的占用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值