FileOutputStream:"close" 方法是否也调用 "flush"?
FileOutputStream: Does the "close" method calls also "flush"?
我对刷新和关闭代码感到很困惑 method.In 我总是关闭我的 FileOutputStream
对象。但是我想知道如果我必须在这里使用flush方法,我可以在哪里使用它?
我会写一个重复下载4或5个文件的项目。我将编写一个方法(用于下载文件),我的方法将处于循环中,下载文件 repeatedly.My 方法将具有这样的代码。
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
用于将"flush"字节保留在缓冲区中。 FileOutputStream
不使用任何缓冲区,因此 flush 方法为空。调用与否不会改变代码的结果。
使用缓冲写入器,方法 close
显式调用 flush
。
所以你需要在关闭流之前和缓冲区满之前写入数据时调用flush(当缓冲区满时writer开始写入而不等待同花顺。
class FileOutputStream
的源代码没有方法 flush
的自定义版本。所以使用的flush
方法是其superclassOutputStream
的版本。 OutputStream
中flush的代码如下
public void flush() throws IOException {
}
如你所见,这是一个什么都不做的空方法,所以调用与否都是一样的。
I will write a project that download 4 or 5 files repeatedly. I will
write a method(for download files) and my method will be in a loop and
download files repeatedly.My method will have a code like this.
Does the close method calls flush, or do I have to use flush before
closing?
我建议使用 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方法是没有作用的,当然可以省略。
如果有疑问(如果你不知道你正在使用哪个子类)我想最好手动调用刷新。
但同样,使用上面的代码是为您考虑的。
我对刷新和关闭代码感到很困惑 method.In 我总是关闭我的 FileOutputStream
对象。但是我想知道如果我必须在这里使用flush方法,我可以在哪里使用它?
我会写一个重复下载4或5个文件的项目。我将编写一个方法(用于下载文件),我的方法将处于循环中,下载文件 repeatedly.My 方法将具有这样的代码。
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
用于将"flush"字节保留在缓冲区中。 FileOutputStream
不使用任何缓冲区,因此 flush 方法为空。调用与否不会改变代码的结果。
使用缓冲写入器,方法 close
显式调用 flush
。
所以你需要在关闭流之前和缓冲区满之前写入数据时调用flush(当缓冲区满时writer开始写入而不等待同花顺。
class FileOutputStream
的源代码没有方法 flush
的自定义版本。所以使用的flush
方法是其superclassOutputStream
的版本。 OutputStream
中flush的代码如下
public void flush() throws IOException {
}
如你所见,这是一个什么都不做的空方法,所以调用与否都是一样的。
I will write a project that download 4 or 5 files repeatedly. I will write a method(for download files) and my method will be in a loop and download files repeatedly.My method will have a code like this.
Does the close method calls flush, or do I have to use flush before closing?
我建议使用 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方法是没有作用的,当然可以省略。
如果有疑问(如果你不知道你正在使用哪个子类)我想最好手动调用刷新。
但同样,使用上面的代码是为您考虑的。