2012-04-23 97 views
1

我用FileOutputStream fos創建/追加和寫入到一個單獨的線程調試文件:當文件被刪除時,FileOutputStream寫入不會引發異常?

fos = new FileOutputStream(outputFile, true); 
    if (!outputFile.exists()) { 
    outputFile.createNewFile(); 
    } 
    fos.write(string.getBytes()); 

此代碼不斷beeing稱爲一個循環,而用戶可能被清除=從另一個線程隨時刪除該文件啓動重新記錄調試輸出。

現在我真的很驚訝,當文件beeing刪除此代碼運行通過沒有引發任何異常,但沒有任何反應。即該文件不再被重新創建,也沒有任何東西被寫入。所有的「寫」都丟失了。

在每次調用fos.write之前,我是否真的必須一直手動檢查文件是否已被刪除?

如果異常會像預期的那樣工作,即寫入已刪除的文件時,它會更簡單和更清晰。

回答

4

這完全取決於操作系統。在Windows上,您不會能夠刪除該文件;但是在類UNIX系統上,這只是它的工作方式,與編程語言無關。鑑於一個文件可以有多個可以獨立刪除的鏈接,你應該明白爲什麼這個行爲是有道理的。事實上,它會導致更容易和更乾淨的行爲,而不是文件被刪除時的爆炸。

+0

謝謝你的明確答案 - 但我不確定我是否真的同意「而事實上,它導致更容易和更乾淨的行爲,而不是文件被刪除時爆炸會。」有一個乾淨的例外來處理這種情況並不真正「爆炸」。儘管如此 - 非常感謝您的明確表達 - 所以我必須在每次寫入文件之前檢查文件是否存在。那我有沒有正確理解你? – user387184 2012-04-23 22:35:15

+0

@ user387184有時嘗試Windows開發...並且您會喜歡* IX文件系統語義;-)無論如何,在寫入之前不要檢查。只有在開放(這是「內置」取決於模式)。如果有人取消鏈接文件(「刪除它」),希望他們有一個理由......更好的方式來「清除」文件可能是截斷它。 – 2012-04-23 22:37:54

+0

在這種情況下,我必須在每次寫入之前檢查文件是否仍然存在,因爲它是一個帶有許多輸出的調試循環,並且用戶可以在任何階段重新開始,忘記所有以前的調試輸出行 - 無論如何,它非常快速,根本沒有問題。再次感謝讓這個水晶般清晰!這就是我喜歡的原因! – user387184 2012-04-23 23:00:57

相關問題