IO流之FileWriter常见错误总结(经验教训)
2019-04-16 本文已影响40人
莫问以
IO流不可谓不熟,但是一旦自己动手写,总是会出一些莫名其妙的错,先看代码:
import java.io.*;
public class TestIO {
public static int i = 0;
public static void main(String[] args) throws IOException{
FileReader fr = new FileReader("F://hello.txt");
BufferedReader br = new BufferedReader(fr);
String line = "";
FileWriter fw = new FileWriter("F://ni.txt");
while((line = br.readLine()) != null){
System.err.println(line);
fw.write(line);
}
fr.close();
br.close();
// fw.close(); //关闭流 释放资源
System.out.print("i == " + i);
}
}
代码很容易理解,就是把hello.txt文件中的内容写到ni.txt文件中去,乍一看,代码没任何毛病,可是一运行:
![](https://img.haomeiwen.com/i13566833/6e94ea615bd4c8ca.png)
发现竟然写入为空,怎么会这样子?发现把注释处取消,竟然就写入了!这是为什么呢?为什么不用FileWriter.flush()?两者有什么区别?我们先看代码:
import java.io.*;
public class TestIO {
public static int i = 0;
public static void main(String[] args) throws IOException{
FileWriter fw = new FileWriter("F://ni.txt");
//调用write方法,将字符串写入到流中。
fw.write("酒剑仙——莫一兮");
//刷新流对象中的缓冲中的数据 将数据刷到目的地中
fw.flush(); //取消注释 才可以写入到ni文件中 但后面write内容写不进去
fw.write("酒剑仙是仙剑中我最喜欢的角色");
FileReader fr = new FileReader("F://ni.txt");
BufferedReader br = new BufferedReader(fr);
String line = "";
while((line = br.readLine()) != null){
System.err.println("ni文件内容为:"+"\n"+line);
}
}
}
代码注释处写的很明了,执行代码,发现第二句话并没有追加到文件中,所以FileWriter .close() 和FileWriter .flush()的区别如下:
new FileWriter()后,我们要执行write() 操作,将数据写入文本,但是这时的数据并没有写入文本,而是存在了计算机中的流中。而如果这是我们使用fw.flush()刷新操作时,是可以将存储在计算机流中的数据写入fw的,但是如果我们之后再write,该数据是写不进去的。
fw.close()是先刷新一次,然后关闭数据流。(事实上,close是包含了两步,flush 和close 这两步)。所以我们可以注释掉flush(),因为在这里一个close()语句就够用了。
flush 刷新后,流可以继续使用,close刷新后,会将流关闭。
需要注意的是:
FileWriter.write()是覆盖写入,如果我们只想要追加,可以这样:
public static void main(String[] args) throws IOException{
FileWriter fw = new FileWriter("F://ni.txt",true);
//调用write方法,将字符串写入到流中。
fw.write(" 追加操作 而非覆盖");
fw.close(); //
FileReader fr = new FileReader("F://ni.txt");
BufferedReader br = new BufferedReader(fr);
String line = "";
while((line = br.readLine()) != null){
System.err.println("ni文件内容为:"+"\n"+line);
}
}
![](https://img.haomeiwen.com/i13566833/880bf41a1238afc9.png)
追加写入也可用RandomAccessFile方法,代码:
import java.io.*;
public class TestIO {
public static int i = 0;
public static void main(String[] args) throws IOException{
// FileWriter fw = new FileWriter("F://ni.txt",true);
// //调用write方法,将字符串写入到流中。
// fw.write(" 追加操作 而非覆盖");
// fw.close(); //
appendMethodA("F://ni.txt","陪你步入蝉夏 跃过城市喧嚣");
FileReader fr = new FileReader("F://ni.txt");
BufferedReader br = new BufferedReader(fr);
String line = "";
while((line = br.readLine()) != null){
System.err.println("ni文件内容为:"+"\n"+line);
}
}
/**
* 追加文件:使用RandomAccessFile
*/
public static void appendMethodA(String fileName, String content) {
try {
// 打开一个随机访问文件流,按读写方式
RandomAccessFile randomFile = new RandomAccessFile(fileName,"rw");
// 文件长度,字节数
long fileLength = randomFile.length();
//将写文件指针移到文件尾。在该位置发生下一个读取或写入操作。
randomFile.seek(fileLength);
// randomFile.writeBytes(content);
//按系统默认编码获取字符串的字节码 避免乱码
randomFile.write(content.getBytes());
randomFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}