簡體   English   中英

FileOutputStream:“close”方法是否也調用“flush”?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM