32

我有一个问题,在写入文件时,在关闭完成之前,我们是否应该包含 flush()??。如果是这样,它将做什么?不要流自动刷新?编辑:

那么冲洗它的实际作用是什么?

4

9 回答 9

25

编写器和流通常会在内存中缓冲一些输出数据,并尝试一次将其写入更大的块。刷新将导致立即从缓冲区写入磁盘,因此如果程序崩溃,该数据不会丢失。当然不能保证,因为磁盘可能不会立即物理写入数据,因此仍然可能丢失。但这不是Java程序的错:)

当您写入行尾时,PrintWriters 会自动刷新(默认情况下),当然当您关闭流和缓冲区时也会刷新它们。除此之外,仅当缓冲区已满时才进行刷新。

于 2009-11-16T14:31:51.053 回答
22

我强烈建议在关闭前调用flush。基本上它将剩余的缓冲数据写入文件。

如果您flush明确调用,您可能会确定任何IOException出来的结果close都是灾难性的,并且与释放系统资源有关。

当您flush自己时,您可以IOException像处理数据写入异常一样处理它。

于 2009-11-16T15:00:51.043 回答
13

您不需要进行刷新,因为 close() 会为您完成。

从javadoc:

“关闭流,首先刷新它。一旦关闭了流,进一步的 write() 或 flush() 调用将导致抛出 IOException。但是,关闭先前关闭的流没有任何效果。”

于 2009-11-16T14:05:32.653 回答
4

为了回答您关于 flush 实际作用的问题,它确保您写入流的任何内容(在您的情况下是一个文件)确实会被写入该文件。

Java可以执行缓冲,这意味着它将保留写入内存中的数据,直到达到一定数量,然后将其全部写入文件,这样效率更高。这样做的缺点是文件不一定在任何给定时间都是最新的。Flush 是一种说法,即“使文件保持最新。

关闭调用首先刷新以确保在关闭文件后具有您期望在其中看到的内容,因此正如其他人所指出的,在关闭之前无需刷新。

于 2009-11-16T14:31:02.930 回答
3

关闭自动冲洗。你不需要调用它。

于 2009-11-16T14:05:26.427 回答
1

正如其他人所说,在 close() 之前调用 flush() 是没有意义的。使用 flush() 的时间是如果您保持文件打开但要确保先前的写入已完全完成。

于 2009-11-16T14:16:00.027 回答
1

如前所述,您通常不需要冲洗。

仅当出于某种原因您希望另一个进程查看您正在使用的文件的完整内容而不关闭它时才有意义。例如,它可以用于由多个进程同时修改的文件,尽管需要非常小心:-)

于 2009-11-16T14:37:24.833 回答
1

FileWriter是一个邪恶的类,因为它会拾取碰巧存在的任何字符集,而不是采用显式的字符集。即使您确实想要默认值,也要明确说明。

通常的解决方案是OutputStreamWriterFileOutputStream。装饰器有可能抛出异常。因此,即使从未构造过编写器,您也需要能够关闭流。如果你打算这样做,你只需要刷新写入器(在快乐的情况下)并始终关闭流。(只是为了混淆,一些装饰器,例如用于处理 zip 的装饰器,具有确实需要关闭的资源。)

于 2009-11-16T19:14:08.597 回答
1

程序中刷新的另一个用例是将长时间运行的作业的进度写入文件(以便以后可以停止并重新启动它。您要确保驱动器上的数据是安全的。

while (true) {
  computeStuff();
  progresss += 1;
  out.write(String.format("%d", progress));
  out.flush();
}
out.close();
于 2013-10-22T07:49:38.757 回答