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