2014-06-17 74 views
1

我使用對象的RandomAccessFile來訪問文件與RandomAccessFile的懸掛指針

RandomAccessFile file = new RandomAccessFile(path, "r"); 

我的問題是,如果文件路徑從磁盤獲取刪除當我執行

file.seek(...); 

file.readLine() 

沒有異常開始,我沒有任何異常。

如果此文件已從磁盤中刪除,是否可能在懸掛指針的情況下發生異常?

是否有另一種檢測文件不可訪問性的方法?

回答

3

編輯:精度爲Windows(感謝pingw33n)

這是完全正常的,你沒有得到Exception時:

  • 你打開一個文件
  • 你或其他人刪除文件
  • 您仍然訪問該文件,請閱讀它的內容刪除之前或寫入它

事實上,刪除文件對文件本身沒有任何影響。被刪除的內容是目錄中的條目。該文件將被真正銷燬(和它使用磁盤上的扇區將被釋放),只有當:

  • 沒有更多的目錄條目指向它
  • 沒有文件描述符保持打開

所以,即使你要求的字節沒有緩衝在內存中,文件系統仍然知道如何從磁盤獲取它。順便說一句,創建臨時文件是一種常見模式,即在最後關閉時將被刪除的文件。

當然,你可以做merlin2011的建議,即通過的路徑測試文件的存在。但是你必須知道文件被刪除並重新創建,路徑(用於打開文件)存在,但指向一個完全不同的對象。

所以,如果你真的需要該文件實際上反映了目錄的內容,你不能把它打開,必須在每一個ACCES重新打開它......這,這不是一個公平的選擇你還可以:

  • 忽略修改目錄和文件系統;你有一個文件,你使用它,句號。這是正確的許多用例。
  • 在您的文檔中聲明該目錄是您的,並且沒有其他人應該刪除其中的文件。畢竟,你無法阻止管理員打破系統或殺死你的應用程序。

對於所有普通文件系統,所有Linux或其他Unix系統,NTFS等都是如此。我不確定它對於諸如CPM或FAT之類的較舊的文件系統是否仍然如此,但它們是目前不再用於製作:-)。但在Windows下,應該不可能刪除當前在Java應用程序中打開的文件。

要準確回答你兩個問題:

  • 指針不晃來晃去,但仍指向一個真正的文件(即使沒有其他人能看到它)
  • 異常將在文件的情況下,拋出無法訪問(物理損壞磁盤或連接,文件系統錯誤等)。但是如果只刪除條目,文件仍然可以訪問
+0

在Java上下文中,所有這些僅適用於* nix,因爲對於Windows而言,Java中沒有標準方法來在正在創建/打開的文件上設置FILE_SHARE_DELETE,以便它們永遠不會被正常刪除。 – pingw33n

+0

感謝Serge Ballesta和Merlin2011的幫助。最後一個問題:我檢查file.readLine()== null,如果是,我關閉並重新打開文件。這是一個正確的程序嗎? –

+0

不,因爲文件已被刪除(刪除條目)和您自己的訪問之間沒有關係。 –

0

你的問題有兩個答案。基於該Javadoc

  • ,你應該得到一個IOException如果任何一個字節不能被讀取的任何理由。

如果任何一個字節不能被讀取超過文件結束,其他任何原因,而不是EOFException的 IOException異常等異常。特別是,如果流已關閉,則可能會拋出IOException異常。

  • 可以明確檢查文件刪除試圖讀取之前,使用該方法描述this answer

    File f = new File(filePathString); 
    if(f.exists() && !f.isDirectory()) { /* do something */ } 
    
+0

當新的RandomAccessFile(path,「r」);完成後,它會被刪除。 –

+0

@Albertoacepsut,我對文檔的解釋是,如果文件稍後被移除,然後嘗試讀取,則會拋出'IOException'。 (這是假設你正在嘗試讀取一個未在內存中緩衝的字節)。 – merlin2011

+0

@ merlin2011你的解釋是合乎邏輯的,但是不正確。詳情請參閱我的回答。 –