写了一个小程序,就是在一个文件中打印100个随机数,但是有点小问题,程序如下:package com.sxtscience.msb.io;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class TestBufferedReader {
public static void main(String[] args) {
try {
FileWriter fw = new FileWriter("D:\\My programs\\JAVA\\first application\\src\\com\\sxtscience\\msb\\io\\TestBuffer.bat");
BufferedWriter bw = new BufferedWriter(fw);
BufferedReader br = new BufferedReader(new FileReader("D:\\My programs\\JAVA\\first application\\src\\com\\sxtscience\\msb\\io\\TestBuffer.bat"));
String line;
for(int i = 0; i < 100; i++) {
/*
 * 在执行bw.write的时候并没有真正的把数据写入文件中,而是写入缓冲区
 * 在文件关闭的时候才真正的写入了文件中
 * */
bw.write(Double.toString(Math.random()));
bw.newLine();
}
// bw.flush();   //如果不加这一句的话会出现错误
while((line = br.readLine()) != null) {
System.out.println(line);
}
bw.close();
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}其中红字的地方如果注释掉的话就会错误,不能输出数值,加上之后就可以输出了,这是什么情况?flush是用来把缓冲区中的东西都写入文件中的吧,那为什么在FileOutputStream中不使用flush也没事呢?还有我发现一个问题就是在使用FileOutputStream或是BufferedWriter的write()方法的时候,不会立刻把数据写入文件中,而是在文件关闭的时候才会写入,这又是什么原理呢,是不是内部运行时使用的是缓冲的机制?

解决方案 »

  1.   

    BufferedWriter从名字你就可以断定是使用了缓冲机制,所以正确的是在要写入的地方都使用flush()方法
      

  2.   

    FileOutputStream 继承 OutputStream 并不提供flush方法的重写 
    所以无论内容多少write都会将二进制流直接传递给底层操作系统 flush无效果
    而Buffered系列的输入输出流函数单从Buffered这个单词就可以看出他们是使用缓冲区的
    应用程序每次IO都要和设备进行通信,效率很低,因此缓冲区为了提高效率,当写入设备时,先写入缓冲区,等到缓冲区有足够多的数据时,就整体写入设备
    楼主flush()的那行可以不写 而是把close()拿上去,flush会刷新缓冲区,而close方法内部是会先调用flush方法再执行关闭方法的,异曲同工。