編輯:精度爲Windows(感謝pingw33n)
這是完全正常的,你沒有得到Exception
時:
- 你打開一個文件
- 你或其他人刪除文件
- 您仍然訪問該文件,請閱讀它的內容刪除之前或寫入它
事實上,刪除文件對文件本身沒有任何影響。被刪除的內容是目錄中的條目。該文件將被真正銷燬(和它使用磁盤上的扇區將被釋放),只有當:
所以,即使你要求的字節沒有緩衝在內存中,文件系統仍然知道如何從磁盤獲取它。順便說一句,創建臨時文件是一種常見模式,即在最後關閉時將被刪除的文件。
當然,你可以做merlin2011的建議,即通過的路徑測試文件的存在。但是你必須知道文件被刪除並重新創建,路徑(用於打開文件)存在,但指向一個完全不同的對象。
所以,如果你真的需要該文件實際上反映了目錄的內容,你不能把它打開,必須在每一個ACCES重新打開它......這,這不是一個公平的選擇你還可以:
- 忽略修改目錄和文件系統;你有一個文件,你使用它,句號。這是正確的許多用例。
- 在您的文檔中聲明該目錄是您的,並且沒有其他人應該刪除其中的文件。畢竟,你無法阻止管理員打破系統或殺死你的應用程序。
對於所有普通文件系統,所有Linux或其他Unix系統,NTFS等都是如此。我不確定它對於諸如CPM或FAT之類的較舊的文件系統是否仍然如此,但它們是目前不再用於製作:-)。但在Windows下,應該不可能刪除當前在Java應用程序中打開的文件。
要準確回答你兩個問題:
- 指針不晃來晃去,但仍指向一個真正的文件(即使沒有其他人能看到它)
- 異常將在文件的情況下,拋出無法訪問(物理損壞磁盤或連接,文件系統錯誤等)。但是如果只刪除條目,文件仍然可以訪問
在Java上下文中,所有這些僅適用於* nix,因爲對於Windows而言,Java中沒有標準方法來在正在創建/打開的文件上設置FILE_SHARE_DELETE,以便它們永遠不會被正常刪除。 – pingw33n
感謝Serge Ballesta和Merlin2011的幫助。最後一個問題:我檢查file.readLine()== null,如果是,我關閉並重新打開文件。這是一個正確的程序嗎? –
不,因爲文件已被刪除(刪除條目)和您自己的訪問之間沒有關係。 –