BufferedWriter和FileWriter先后关闭顺序的影响
bufferedWriter和fileWriter的关闭顺序不可颠倒
如下例
读入1.txt中的数字
以n1+n2+n3=n的形式写入2.txt
1.txt内容为
见代码如下:
package javatest;
import java.io.*;
import java.util.ArrayList;
public class File_RW {
private FileReader fileReader;
private FileWriter fileWriter;
private BufferedReader bufferedReader;
private BufferedWriter bufferedWriter;
private ArrayList<String> as;
private void readFile() {
String s = "";
try {
fileReader = new FileReader("D:\\a资料\\java文件\\1.txt");
bufferedReader = new BufferedReader(fileReader);
if ((s = bufferedReader.readLine()) != null) { //读入文件第一行内容到字符串s
as = new ArrayList<String>();
String[] temp = s.split(" "); //按空格分开存入字符串数组
for (String str : temp)
as.add(str);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedReader != null)
bufferedReader.close();
if (fileReader != null) {
fileReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void writeFile() {
StringBuffer s;
int sum = 0;
try {
fileWriter = new FileWriter("D:\\a资料\\java文件\\2.txt", false); //false:以覆盖形式写入文件
bufferedWriter = new BufferedWriter(fileWriter);
s = new StringBuffer();
for (String str : as) {
s.append(str).append("+");
sum += Integer.valueOf(str); //存所有数相加后的值
}
s.deleteCharAt(s.length() - 1); //删除最后一个+
s.append("="); //结尾加上=
s.append(sum); //加入值
bufferedWriter.flush(); //先刷新缓冲,否则写入为空
bufferedWriter.write(s.toString());
System.out.println(s.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedWriter != null) //重点就在这里,bufferedWriter和fileWriter的关闭顺序不可颠倒
bufferedWriter.close(); //否则会报错,导致写入失败
if (fileWriter != null)
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
File_RW file_rw = new File_RW();
file_rw.readFile();
file_rw.writeFile();
}
}
代码执行后
2.txt的内容如下:
注意:bufferedWriter.flush(); //先刷新缓冲,否则写入为空
flush()不能少,进行刷新,就是把缓存中的数据写入流中
同时最后记得关闭流close()
原因在于bufferedWriter、fileWriter操作的是同一个流资源…故相互有影响
而bufferedWriter依赖于fileWriter
bufferedWriter = new BufferedWriter(fileWriter);
故如果先关闭fileWriter再关闭bufferedWriter就会引起错误,应注意