flush问题

来源:互联网 发布:游戏出海 知乎 编辑:程序博客网 时间:2024/03/29 01:44

1. flush的问题

写程序的时候发现flush的位置不同的话会导致不同的输出结果,下面是一个小程序,就是向一个文件中输入数据:

package com.sxtscience.msb.io;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.util.Date;public class TestPrintStream3 {public static void main(String[] args) {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));try {FileWriter fr = new FileWriter("D:\\My programs\\JAVA\\first application\\src\\com\\sxtscience\\msb\\io\\TestPrintStream.log", true);PrintWriter pw = new PrintWriter(fr);BufferedWriter bw = new BufferedWriter(fr);String line = null;while(!(line = br.readLine()).equalsIgnoreCase("exit")) {System.out.println(line.toUpperCase());pw.println("---" + line + "---");bw.write("---------------我是华丽的分割线---------------");bw.newLine();bw.flush();pw.flush();}//bw.flush();    //flush的书写位置会改变输出的结果,在每一次write之后都flush一下//pw.flush();pw.println("========" + new Date() + "=======");pw.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

其中PaintWriter和BufferedWriter的对象的初始化都是用的是FileWriter的对象,在从控制台读入数据并进行打印和输入到文件的时候,如果把flush写在代码中注销的位置的话,

最终打印的结果为:

---cnads---
---vnaasfe---
---------------我是华丽的分割线---------------
---------------我是华丽的分割线---------------
========Mon Mar 11 17:24:21 CST 2013=======

说明在输出的时候都是用了缓冲区,pw和bw都进行了缓冲存储,所以循环结束后再调用flush就先把bw缓冲里的数据打印完,然后再把fw里的数据打印完。如果把flush语句拿

到循环的里面打印结果就正确了:

---nnadskncjkd---
---------------我是华丽的分割线---------------
---hauihei---
---------------我是华丽的分割线---------------
========Mon Mar 11 17:27:05 CST 2013=======

但是如果不加flush语句的话最终pw.print()可以打印到文件,但是bw.write()无法打印到文件:

---cadsjj---
---ere---
========Mon Mar 11 17:28:27 CST 2013=======

这个应该还是和BufferedWriter的缓冲机制有关系的,具体的实现细节还是有待继续研究····


未完待续···

原创粉丝点击