簡體   English   中英

Java BufferedWriter close()

[英]Java BufferedWriter close()

假設我有以下代碼片段:

operation1();
bw.close();
operation2();

當我從我的代碼中調用BufferedReader.close() ,我假設我的JVM進行系統調用,確保緩沖區已被刷新並寫入磁盤。 我想知道close()等待系統調用來完成其操作,或者它是否繼續執行operation2()而不等待close()完成。

為了重新解釋我的問題,當我執行operation2() ,我可以假設bw.close()已成功完成嗎?

當我執行operation2()時,我可以假設bw.close()已成功完成嗎?

關閉水流,先沖洗它。 關閉流后,進一步的write()或flush()調用將導致拋出IOException。 但是,關閉先前關閉的流不起作用。

雖然文檔沒有具體說明,但我認為這個調用會阻塞直到完成。 事實上,我很確定java.io包中沒有任何內容是非阻塞的。

如果使用java.io.Reader完成,則java.io.Reader java.io.BufferedReader.close()的JavaDoc完全取自合同。

醫生說:

關閉流並釋放與其關聯的所有系統資源。 關閉流后,進一步的read(),ready(),mark(),reset()或skip()調用將拋出IOException。 關閉先前關閉的流無效。

雖然在文件系統完成之前沒有明確聲明阻塞,但使用BufferedReader相同實例,如果close()返回,則所有其他操作都將拋出異常。 盡管可以看出JavaDoc在操作完成時有些含糊不清,但如果文件系統刷新和關閉在此方法返回時未完成,則會違反合同的精神並成為Java中的錯誤(實現或文檔)。

沒有! 由於以下原因,您無法確定:

BufferedWriter是另一個Writer的包裝器。 BufferedWriter的close()只傳播到底層的Writer。

如果這個底層Writer是一個OutputStreamWriter,並且如果OutputStream是一個FileOutputStream,那么close將發出一個系統調用來關閉文件句柄。

您完全可以自由地使用Writer,其中close()是noop,或者close是非阻塞實現的,但是當只使用java.io中的類時,情況絕對不是這樣。

Writer (或BufferedWriter )是一個黑盒子,它在某處寫入一個字符流,而不一定寫入磁盤。 close()調用必須 (通過方法契約)在關閉之前刷新其緩沖的內容,並且應該 (通常)在完成所有“基本”工作之前阻塞。 但這取決於實現和環境(例如,您無法了解Java層下面的緩存)。 在Java編寫器本身要完成的工作的哪些方面(例如:使系統調用寫入磁盤,在FileWriter或akin的情況下,並關閉文件句柄),是的,你可以假設在close()它已經完成了所有的工作。

通常,對於任何i / o操作,即使在close之后,也無法對write()操作完成后發生的事情做出任何假設。 delivery的想法是相對於媒介的主觀概念。

例如,如果writer表示TCP連接,然后數據在客戶端和服務器之間丟失怎么辦? 或者,如果內核將數據寫入磁盤,但驅動器在物理上無法寫入,該怎么辦? 或者,如果作者代表在途中被槍殺的載體鴿?

此外,想象一下當寫入無法確認端點已接收到數據時的情況(讀取:udp / datagrams)。 在這種情況下,阻止政策應該是什么?

緩沖區將刷新到操作系統並關閉文件句柄,因此所需的Java操作已完成。

但是操作系統會將寫入緩存或排隊到實際的磁盤,管道,網絡等等 - 無法保證物理寫入已完成。 FileChannel.force()為本地磁盤上的文件提供了一種方法:請參閱Javadoc。

是的, 如果你到達operation2(); ,這條小溪必須完全關閉。 但是, close() throws IOException ,因此您甚至可能無法訪問operation2(); 這可能是也可能不是您期望的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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