我有一个问题,在写入文件时,在关闭之前,我们应该包括flush()吗?如果是这样它会做什么呢?不流自动冲洗? 编辑:
如此冲洗它实际上做什么?
答案 0 :(得分:22)
写入器和流通常会将一些输出数据缓冲在内存中,并尝试一次将其写入更大的块中。刷新将导致从缓冲区立即写入磁盘,因此如果程序崩溃,则数据不会丢失。当然不能保证,因为磁盘可能不会立即物理写入数据,因此它仍然可能丢失。但那不会是Java程序的错::)
当您编写行结束时,PrintWriters会自动刷新(默认情况下),当然,当您关闭它们时,流和缓冲区会刷新。除此之外,只有当缓冲区已满时才会刷新。
答案 1 :(得分:21)
我强烈建议在关闭前调用flush。基本上它将剩余的缓冲数据写入文件。
如果您明确致电flush
,您可能会确定IOException
中出现的任何close
都是灾难性的,与发布系统资源有关。
当您自己flush
时,您可以像处理数据写入异常一样处理其IOException
。
答案 2 :(得分:13)
您不需要执行刷新,因为close()会为您执行此操作。
来自javadoc:
“关闭流,先将其刷新。一旦流关闭,进一步的write()或flush()调用将导致抛出IOException。然而,关闭先前关闭的流没有任何效果。”
答案 3 :(得分:4)
要回答关于flush实际执行的操作的问题,它会确保您写入流中的任何内容(在您的情况下为文件)确实会在那里写入文件。
Java可以执行缓冲,这意味着它将保留在内存中写入的数据,直到它具有一定的数量,然后一次性将其全部写入文件,这样更有效。这样做的缺点是文件在任何给定时间都不一定是最新的。 Flush是一种说法“使文件保持最新。
首先关闭调用flush以确保在关闭文件后具有您期望在其中看到的内容,因此正如其他人指出的那样,在关闭之前无需刷新。
答案 4 :(得分:3)
关闭自动刷新。你不需要打电话。
答案 5 :(得分:1)
正如其他人所说,在close()之前调用flush()是没有意义的。使用flush()的时间是你保持文件打开但是要确保先前的写入已经完全完成。
答案 6 :(得分:1)
如上所述,您通常不需要冲洗。
只有在出于某种原因,您希望其他进程看到您正在使用的文件的完整内容而不关闭它时才有意义。例如,它可以用于由多个进程同时修改的文件,尽管有很多小心: - )
答案 7 :(得分:1)
FileWriter
是一个邪恶的类,因为它拾取了碰巧在那里的任何字符集,而不是采用明确的字符集。即使您确实需要默认值,也要明确它。
通常的解决方案是OutputStreamWriter
和FileOutputStream
。装饰器可能会抛出异常。因此,即使编写器从未构建,您也需要能够关闭流。如果你打算这样做,你只需要刷新编写器(在快乐的情况下)并始终关闭流。 (只是令人困惑,一些装饰器,例如处理拉链,有资源需要关闭。)
答案 8 :(得分:1)
在程序中刷新的另一个用例是将长时间运行的作业的进度写入文件(因此可以在以后停止并重新启动。您希望确保数据在驱动器上是安全的。
while (true) {
computeStuff();
progresss += 1;
out.write(String.format("%d", progress));
out.flush();
}
out.close();