Java FileOutputStream:;“关闭”;方法调用也为;齐平;?

Java FileOutputStream:;“关闭”;方法调用也为;齐平;?,java,io,fileoutputstream,Java,Io,Fileoutputstream,我对flush和close方法很困惑。在我的代码中,我总是关闭我的FileOutputStream对象。但我想知道,如果我必须在这里使用flush方法,我在哪里可以使用它 我会写一个项目,下载4或5个文件重复。我将编写一个方法(用于下载文件),我的方法将在一个循环中重复下载文件 close方法调用flush,还是在关闭前必须使用flush try { InputStream inputStream = con.getInputStream(); 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

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

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

因此,当您希望在关闭流之前写入数据时,需要调用flush,并且在缓冲区已满之前(当缓冲区已满时,写入程序无需等待flush调用即可开始写入)

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

public void flush() throws IOException {
}
正如您所看到的,这是一个空方法,不做任何事情,因此是否调用它是相同的

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

close方法是调用flush,还是必须先使用flush 关门

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

try (InputStream inputStream = con.getInputStream()){
    Files.copy(inputStream, Paths.get("C:\\programs\\TRYFILE.csv"));
}
这个主题有点混乱,因为它确实不需要自动刷新,但是子类可能会指定它。它们还可能提供一个不执行任何操作的flush方法(例如,作为从OutputStream继承的方法,这是FileOutputStream的情况)。当然,在这种情况下,调用flush方法没有任何效果,因此可以忽略它

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


但同样,使用上面的代码也会很小心。

文档是有目的的。密切相关:可能重复的代码不能(直接)回答这个问题,这就是我投反对票的原因。@nbro它解决了问题,但没有提出刷新/关闭的问题,所以我认为答案是正确的。@Puce这里没有问题,只是一个简单的问题不,这只是OP的另一种方式,它不回答问题,即使它可能解决问题,我不知道说实话,但我会取消我的反对票,因为我不喜欢成为[_;]@Hacketo它不仅仅是一个样本,但是一个具体的用例。所以,你说我的代码;使用flush和不使用flush没有区别吗?您对此绝对确定吗?@javauser35但在访问文件系统时,实际上建议使用缓冲读写器。但是BufferedOutputStream会在关闭时自动调用flush。我查看了Fileoutputstream的源代码。是的,你是对的,但该类中有一个finalize方法,它有flush()方法。但该flush()方法来自超类,它又是空的,不做任何事情。对吗?我真的理解该方法吗?谢谢,这真的很有帮助。