【问题标题】:FileOutputStream: Does the "close" method calls also "flush"?FileOutputStream:“close”方法调用是否也“flush”?
【发布时间】:2015-10-06 01:02:54
【问题描述】:

我对刷新和关闭方法感到非常困惑。在我的代码中,我总是关闭我的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

【问题讨论】:

标签: java io fileoutputstream


【解决方案1】:

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

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

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

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

public void flush() throws IOException {
}

正如你所见,这是一个什么都不做的空方法,所以调用与否是一样的。

【讨论】:

  • 所以,你说我的代码;使用冲洗与不使用没有区别吗?你确定吗?
  • @javauser35 但是在访问文件系统时,实际上建议使用缓冲读取器/写入器。但随后 BufferedOutputStream 会自动调用 flush on close。
  • 我查看了 Fileoutputstream 的源代码。是的,您是对的,但是该类中有一个 finalize 方法,并且它具有 flush() 方法。但是该 flush() 方法来自超类,并且再次来自超类是空的,什么也不做。我是对的,我真的理解这种方法吗?
  • 谢谢,真的很有帮助。
【解决方案2】:

我将编写一个重复下载 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 确实不需要自动刷新,但子类可能会指定这一点。它们还可能提供一种什么都不做的刷新方法(例如,作为从 OutputStream 继承的方法,FileOutputStream 就是这种情况)。在这种情况下调用flush方法当然是没有效果的,所以你可以省略它。

如果有疑问(如果您不知道自己正在使用哪个子类),我想最好手动调用刷新。

但同样,使用上面的代码会为您服务。

【讨论】:

  • 这不能(直接)回答这个问题,这就是我投反对票的原因。
  • @nbro 它解决了问题而没有提出关于冲洗/关闭的问题,所以我认为答案是有效的。
  • @Puce这里没有问题,只是一个简单的问题
  • 不,这只是 OP 的替代方式,它不回答问题,即使它可能解决问题,老实说,我不知道,但我会删除我的反对票,因为我不喜欢 [__]
  • @Haketo 这不仅仅是一个示例,而是一个具体的用例。
猜你喜欢
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
相关资源
最近更新 更多