FileOutputStream:"关闭"方法调用" flush"?

时间:2015-07-16 14:10:34

标签: java io fileoutputstream

我对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

2 个答案:

答案 0 :(得分:25)

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

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

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

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

public void flush() throws IOException {
}

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

答案 1 :(得分:-1)

  

我会写一个重复下载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方法(例如,从OutputStream继承的方法,FileOutputStream的情况)。在这种情况下,当然,调用flush方法没有任何效果,所以你可以省略它。

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

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