2011-06-23 67 views
11

我們的java程序不斷將一些重要的數據寫入文件。現在,我們希望拋出一些異常,或者在某些用戶手動刪除文件(Java程序正在寫入的文件)時在控制檯上顯示某種錯誤消息。Java - 如何在寫入文件時檢測文件刪除?

我發現java在嘗試寫入已被刪除的文件時不會引發任何異常。

方法一 -啓動一個新的線程,它將繼續檢查文件是否存在,並在文件被刪除時通知主java程序。這在我們的情況下不起作用,因爲我們將有幾個文件將被Java程序寫入,因此爲每個文件啓動一個新線程將不會提高內存效率。

方法II -每次在寫入文件之前檢查是否存在文件。這也不是一個好方法,因爲檢查文件的存在是一個代價高昂的操作。

方法III -擴展java.io.FilterWriter中(我們使用的是寫一個文件),並覆蓋的write()方法拋出異常時,它會嘗試寫到已經文件刪除。這似乎是一個很好的解決方案,但是我找不到Java正在消化某個異常(當它試圖寫入已刪除的文件時)的地方,我們可以通過重寫該方法來拋出該異常。

+0

這是Windows還是Unix?您是在每次寫入後關閉文件,還是在整個運行期間將其保持打開狀態? – Gabe

+0

@Gabe它是Unix。在Windows中,如果文件正被某個進程使用,則無法刪除該文件。 –

+0

在Unix中,無法知道已打開的文件是否已被刪除,因此在這種情況發生時,Java(或任何其他語言)無法引發異常。 – Gabe

回答

1

在這種情況下,FileChannelFileLock類可能會有所幫助。

看到How can I lock a file using java (if possible)

+0

以任何方式描述鎖定是否阻止鎖定的文件被刪除? – Gabe

+1

@Gabe:似乎在Unix/Linux下的鎖定只是建議性的,並不妨礙從其他進程中刪除文件。 – splash

+0

有時鎖定是強制性的(您實際上不能使用被鎖定的文件部分),但即使如此,我認爲它不會阻止您刪除鎖定的文件。 – Gabe

1

在Unix下,有文件和有目錄。一個文件可以出現在任意數量的目錄中,一個打開的文件可以在磁盤上,但不會出現在任何目錄中。如果從一個目錄中刪除一個文件,該目錄是對目錄的更改,而不是該文件。

要確定目錄是否已更改,您需要使用File.exists()輪詢其路徑。 Java 7有一個目錄觀察器,可以避免輪詢。

+1

用於在Java7中提及DirectoryWatcher的+1 –

1

首先,我懷疑,如果您嘗試寫入缺少的文件,java不會拋出異常。什麼可能發生的是,UNIX下的文件被用戶刪除,但過程還是寫入到備份文件(自己的副本)

看看apache的公地IO文件監控包: http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/monitor/package-summary.html 基本上,你可以註冊不同事件的監聽器(文件刪除,目錄刪除等)和監聽器。

如果你想防止刪除,我會看看@splash的評論。 另一種選擇是寫入您自己的臨時目錄中的隱藏文件。

+0

+1 ...您正在談論哪個註釋? –

+0

與FileLock的一個 – peshkira

-1
  1. 在Unix,Linux,Solaris,MacOS,HP/UX,AIX等中,沒有辦法檢測到打開的文件已被刪除。

  2. 在Windows中,不可能刪除打開的文件。

所以你的問題沒有明顯的答案。