flush问题

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


未完待续···

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值