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

2022-09-01 17:22:32

我对冲洗和关闭方法感到非常困惑。在我的代码中,我总是关闭我的对象。但是我想知道,如果我必须在这里使用齐平方法,我在哪里可以使用它?FileOutputStream

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

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

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


答案 1

该方法用于“刷新”缓冲区中保留的字节。 不使用任何缓冲区,因此刷新方法是空的。无论是否调用它都不会更改代码的结果。flushFileOutputStream

对于缓冲编写器,该方法显式调用 。closeflush

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

类 的源代码没有方法 的自定义版本。因此,使用的方法是其超类的版本 。齐平代码如下FileOutputStreamflushflushOutputStreamOutputStream

public void flush() throws IOException {
}

正如你所看到的,这是一个不执行任何操作的空方法,因此无论是否调用它是一样的。


答案 2

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

close 方法是否调用刷新,还是我必须在关闭前使用 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 方法没有任何效果,因此您可以省略它。

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

但同样,使用上面的代码,这对您来说很重要。


推荐