Java中FileWriter的flush和close函数在使用时有什么区别?

60

我需要知道Java中flush和close函数的确切区别是什么?

以及在文件写入期间数据何时被转储到文件中?

请提供一个例子。

5个回答

79

flush()函数确保将任何缓冲的数据写入磁盘(在这种情况下-通常为刷新您使用的任何IO管道)。之后仍可以向流(或writer)写入数据。

close()函数刷新数据并指示没有更多数据。它关闭任何文件句柄、套接字或其他内容。此后就无法再向流(或writer)写入数据。

请注意,没有调用flush()函数时,仍然可以向相关的IO管道写入数据-只是可能会缓冲一些数据。

close()通常也会调用flush()函数,但最近有人指出,在某些JDK实现中,作为关闭的一部分而导致刷新抛出的任何异常都将被忽略 :(


flush()就足够了吗?还是我们应该在flush之后调用close? 如果我想调用flush - VedantK

62

flush()函数将缓冲区的内容写入目标并清空缓冲区,但不会永久关闭流。这意味着,您仍然可以向该流写入更多数据。

而close()函数则永久关闭流。如果您想继续写入一些数据,则需要重新打开流并将新数据与现有数据一起追加。


当使用BufferedWriter(或BufferedReader)时,我们不必担心flush() - BufferedWriter在缓冲区满时会自动内部刷新。 - enator
2
但是在最后,如果缓冲区既不为空也不满,并且我们想将最后一部分写入磁盘(这几乎总是需要的),我们必须显式/手动地flush()它,这非常必要。 - WesternGun
2
@WesternGun 不需要显式调用 flush() 来刷新 BufferedWriter,只要你调用 close() 方法关闭写入器即可。close() 方法会自动执行刷新操作。 - gsl

6

flush() 方法将缓冲区内容刷新到目标位置。你可以再次向流中写入内容。close() 方法将缓冲区内容刷新到目标位置并关闭流。在 close() 之后,你不能再写入任何内容。


2
Jon Skeet 15秒前写的)) - shift66

3

flush() :为了刷新输出流,请使用DataOutputStream类的void flush()方法。该方法内部调用底层OutputStream类的flush()方法,强制将任何缓冲的输出字节写入流中。

close() :通常关闭流、连接和套接字。

请参见flushclose示例


但是,每当它遇到要写入文件的数据时,它会立即刷新文件中的数据或内容吗? - mum
不,它不会立即清空数据。它会强制输出字节将数据写入流中。当您调用 close 方法时,它会刷新数据并指示没有更多数据。 - Suresh

0

flush方法将刷新流中的所有内容到目标位置。写入内容后,可能不在目标位置。

close方法将关闭流并在关闭之前执行刷新操作。

以下是我从Oracle Java I/O教程中获得的信息。

要手动刷新流,请调用其flush方法。 flush方法适用于任何输出流,但除非流具有缓冲区,否则没有效果。

如果您仅使用fileWriter而没有缓冲区,则使用flush没有效果。您唯一需要做的就是关闭流。而close方法将在关闭流之前刷新流。

如果我理解正确,只要我们记得关闭流,就可以了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接