FileWriter的flush问题

zeko075 2013-03-10 11:29:28
写了一个小程序,就是在一个文件中打印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()方法的时候,不会立刻把数据写入文件中,而是在文件关闭的时候才会写入,这又是什么原理呢,是不是内部运行时使用的是缓冲的机制?
...全文
568 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
a597926661 2013-03-11
  • 打赏
  • 举报
回复
FileOutputStream 继承 OutputStream 并不提供flush方法的重写 所以无论内容多少write都会将二进制流直接传递给底层操作系统 flush无效果 而Buffered系列的输入输出流函数单从Buffered这个单词就可以看出他们是使用缓冲区的 应用程序每次IO都要和设备进行通信,效率很低,因此缓冲区为了提高效率,当写入设备时,先写入缓冲区,等到缓冲区有足够多的数据时,就整体写入设备 楼主flush()的那行可以不写 而是把close()拿上去,flush会刷新缓冲区,而close方法内部是会先调用flush方法再执行关闭方法的,异曲同工。
阿甘1976 2013-03-11
  • 打赏
  • 举报
回复
BufferedWriter从名字你就可以断定是使用了缓冲机制,所以正确的是在要写入的地方都使用flush()方法
  • 打赏
  • 举报
回复
flush的不是地方。

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧