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 block
e.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的缓冲机制有关系的,具体的实现细节还是有待继续研究····
未完待续···