[英]FileOutputStream: Does the “close” method calls also “flush”?
我真的很困惑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(當緩沖區已滿時,編寫器開始寫入而不等待刷新調用)。
FileOutputStream
類的源代碼沒有方法flush
的自定義版本。 因此使用的flush
方法是其超類OutputStream
的版本。 OutputStream
中的flush代碼如下
public void flush() throws IOException {
}
如你所見,這是一個空的方法什么都不做,所以調用與否是相同的。
我將編寫一個重復下載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方法沒有任何效果,所以你可以省略它。
如果有疑問(如果你不知道你正在使用哪個子類),我想最好手動調用flush。
但同樣,使用上面的代碼會照顧你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.