FileOutputStream:“close”方法是否也调用“flush”?

我真的很困惑flush和close方法。在我的代码中,我总是关闭我的FileOutputStream对象。 但我想知道如果我必须在这里使用flush方法,我在哪里可以使用它?

我将编写一个重复下载4或5个文件的项目。 我将编写一个方法(用于下载文件),我的方法将循环并重复下载文件。我的方法将有这样的代码。

close方法是否调用flush ,或者在关闭之前是否必须使用flush?

 try { InputStream inputStream = con.getInputStream(); FileOutputStream outputStream = new FileOutputStream("C:\\programs\\TRYFILE.csv"); int bytesRead = -1; byte[] buffer = new byte[4096]; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } } catch(Exception e) { // } finally { outputStream.close(); inputStream.close(); } 

请注意,代码运行良好:它成功下载文件。 但我不确定使用flush

方法flush用于“刷新”保留在缓冲区中的字节。 FileOutputStream不使用任何缓冲区,因此flush方法为空。 调用与否不会改变代码的结果。

对于缓冲编写器,方法close调用显式flush

因此,当您想要在关闭流之前和缓冲区已满之前写入数据时需要调用flush(当缓冲区已满时,编写器开始写入而不等待刷新调用)。

FileOutputStream类的源代码没有方法flush的自定义版本。 因此使用的flush方法是其超类OutputStream的版本。 OutputStream中的flush代码如下

 public void flush() throws IOException { } 

如你所见,这是一个无效的空方法,所以调用与否是相同的。

我将编写一个重复下载4或5个文件的项目。 我将编写一个方法(用于下载文件),我的方法将循环并重复下载文件。我的方法将有这样的代码。

close方法是否调用flush,或者在关闭之前是否必须使用flush?

我建议使用NIO.2 API和try-with-resources语句。 这将减少代码量并负责刷新和关闭流:

 try (InputStream inputStream = con.getInputStream()){ Files.copy(inputStream, Paths.get("C:\\programs\\TRYFILE.csv")); } 

该主题有点令人困惑,因为OutputStream.close确实不需要自动刷新,但是子类可能指定了这一点。 它们还可能提供一个不执行任何操作的flush方法(例如,从OutputStreaminheritance的方法,FileOutputStream就是这种情况)。 在这种情况下,当然,调用flush方法没有任何效果,所以你可以省略它。

如果有疑问(如果你不知道你正在使用哪个子类)我想最好手动调用flush。

但同样,使用上面的代码会照顾你。