项目场景:
`
在一个文件中有一些数据,需要读取出来并替换成其他字符再写回文件中,需要用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();}}}
运行结果:
证明假说成立,所以在用到缓冲流的时候要注意缓冲区,不能同时打开两个流,否则会被后打开的占用。