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