关闭缓冲区之前,务必调用flush()方法

    这几天在看Java IO,感觉很乱。因为很重要,所以硬着头皮反复看,终于有点头绪。

    昨晚写得测试代码只有FileReader,刚才上机课闲着没事,修改了下,增加了FileWriter、BufferedReader和BufferedWriter。

如题,本文不想讲解怎么使用上面的类,只是想说一下flush()方法很重要!

    开始的时候,在D盘根目录下建了个 love.txt文件,很小,就几个字符。开始没调用flush()方法,生成的android.txt文件下竟然是空的,预想的应该是love.txt文件内容的复制。反复看这段代码,难道是FileWriter或者BufferedWriter没用对,发现这部分没错。然后就看API,正好看到了flush()方法,然后恍然大悟。我竟然把这么重要的事儿忘了,关闭缓冲区前,应该把缓冲区的“残余”数据强制写出。后来,我把love.txt里的内容增加到了192k,先不调用flush(),那么输出的android.txt文件只有190k,很明显,数据有丢失,丢失的就是缓冲区“残余”的数据。后来调用flush(),输出的android.txt文件和love.txt文件的大小一样,数据没有丢失。

开始的时候因为love.txt文件的内容太少了,还没装满缓冲区,被当成“残余”数据了,所以没复制过去。后来把love.txt文件增大,发现了是数据丢失了。。。

API对flush()方法说明如下: 

public void flush()
throws IOException刷新该流的缓冲。

个人感觉“刷新”一词用的不贴切,应该用"强制写出缓冲区的数据"比较贴切。
小小flush()的用处竟然这么大,这回我可记忆犹新,永远忘不掉了。
饿了,带着好心情吃饭去。。。

 


 

import java.io.*; public class ReaderAndBufferedTest{ public static void main(String[] args){ try{ File fileDir=new File("D:/aaa/bbb/ppls"); fileDir.mkdirs(); File file=new File(fileDir,"android.txt"); FileReader in=new FileReader("D:/love.txt"); FileWriter out=new FileWriter(file); BufferedReader br=new BufferedReader(in); BufferedWriter bw=new BufferedWriter(out); int b; System.out.println("下面读取文件"); while((b=br.read())!=-1){ System.out.print((char)b); bw.write(b); } bw.flush();//务必写 in.close();//勿写br.close()和bw.close() out.close(); }catch(FileNotFoundException e){ System.out.println("/n找不到文件"); System.exit(-1); }catch(IOException e){ e.printStackTrace(); System.exit(-1); } System.out.println("/n文件已复制"); } }

 

 

你可能感兴趣的:(关闭缓冲区之前,务必调用flush()方法)