嗨我需要一个答案,因为java.since中的I / O流必须刷新,在我的程序中使用flush并且没有flush,输出是相同的。所有内容都写入目标文件。这就是为什么我需要flush?将文件输入流消耗缓冲内存吗?
以下是我的简单示例程序
file = new File("c:/newfile.txt");
fop = new FileOutputStream("c:/newfile.txt");
// if file doesnt exists, then create it
if (!file.exists()) {
file.createNewFile();
}
// get the content in bytes
byte[] contentInBytes = content.getBytes();
fop.write(contentInBytes);
fop.flush();
fop.close();
即使我命令刷新并关闭它也可以正确地将内容写入文件..?然后我们需要刷新?并且文件输出会消耗内存吗?
答案 0 :(得分:1)
在流上关闭调用flush,因此如果要关闭流,则不需要刷新。
如果要确保保存数据,而不关闭流,例如,则刷新很有用。通过Internet发送消息或写入控制台时。您可能会注意到,如果您使用system.out.print()写入控制台,则输出不会显示,直到您调用flush,或者直到文本中有新行为止(在这种情况下,Java将调用flush你)。
详情请见this question
答案 1 :(得分:0)
实际上,FileOutputStream
没有缓冲,因此数据直接写入文件。
抽象OutputStream
定义flush
(一个空方法)以满足缓冲流的需求,因此FileOutputStream
继承它。
如果您不确定底层实现,通常最好在关闭流之前刷新流。
此外,在您的代码中有一点错误:
file = new File("c:/newfile.txt");
fop = new FileOutputStream("c:/newfile.txt");
// Will never happen, new FileOutputStream creates the file
if (!file.exists()) {
file.createNewFile();
}
修改强>
关于问题的close
部分:
当您注释掉close()
,然后退出main()
时,终结器会调用close
方法(即在流被垃圾回收之前,JVM线程会调用其finalize()
}方法,它反过来调用close()
方法),但你不能明智地依赖终结器:你不拥有它,你不能确定它何时被激活。
同样,最佳做法是明确调用close()
。