2011-04-22 54 views
3

我有一個將文件寫入磁盤的Java應用程序。問題是,Linux不像Windows那樣鎖定文件,所以有人可以在文件寫入時刪除它。當發生這種情況時,我的Java應用程序一直在繼續,就像文件仍然存在一樣......甚至允許寫入更多,但沒有例外。Linux上的Java寫入文件被刪除,但我仍然可以寫入它

我添加了一個檢查:file.exists(),但是這使我的表現幾乎殺死了50%。任何人有什麼聰明的想法,我可以如何解決這個問題,並保持我的表現高?

+0

我們在我們的產品中遇到了同樣的問題 - 我們最終將其記錄爲限制。 – AbdullahC 2011-04-22 14:53:42

+0

您可以使用組權限並鎖定目錄。您的程序可能是具有適當權限的組中唯一的用戶。這是一個混亂,但它可能有助於減少意外刪除。 – karakuricoder 2011-04-22 15:07:14

+0

權限不會幫助。畢竟,root(例如)擁有所有權力。 – 2011-04-22 15:45:33

回答

2

unix下的「文件」是一個未命名的i節點(其中包含數據)以及指向該i節點的目錄中的零+條目。零或更多。這意味着您可以刪除名稱,但是i節點仍然存在,如果打開,可以寫入並從中讀取。

但是,在每次寫入時不需要檢查f.exists()。偶爾做一次(比如說15秒一次)。你的表現不會傷害太多。

+0

不幸的是,這不是一個選項,因爲我們不能錯過任何東西。我認爲唯一的解決方案是使用文件權限作爲停止差距。感謝您的幫助 – user671731 2011-04-22 15:46:13

+0

權限不會幫助您。根或組員會刪除你的文件就好了。 – 2011-04-22 15:47:45

+0

是的,我明白了,但性能影響太大,無法在每次寫入之前檢查文件是否存在。只要不得不交叉手指,並希望沒有意外刪除。 – user671731 2011-04-22 16:27:24

7

聽說這被認爲是一個「問題」很有趣 - 我們這些在UNIX上cut牙咧咧的人認爲Windows的文件鎖定方法是粗糙和痛苦的。

如果您不能使用文件權限(大部分)防止這種情況,我認爲File.exists()是唯一的解決方案在這裏,但想必你可能不經常調用它,如果它導致性能問題 - 也許從一個「收割者」線程偶爾醒來檢查這種情況。

+0

感謝您的回覆。我不認爲這是一個文件沒有「鎖定」的問題,我只是認爲這是一個問題,Java不會出錯。我想知道如何寫入一個不存在的文件。操作系統不會在已刪除的文件上丟棄文件句柄? – user671731 2011-04-22 15:01:20

+4

請注意,這根本不是Java的東西 - 所有的代碼都會做同樣的事情。至於它是如何工作的:只要任何進程引用文件,文件的內核數據結構就不會消失。 UNIX是圍繞着一切都是文件 - 終端,網絡,各種設備,甚至是「/ dev/null」這個無處不在的特殊文件 - 所以寫入文件的概念物理上的存在並不是外來的。 – 2011-04-22 15:22:48

+1

文件仍然存在,只有它的名字消失了。學習Unix兄弟! ;) – 2011-04-22 15:43:29

2

如果您不介意減少程序的可移植性,您可以使用類似jnotify的東西在文件被刪除時得到通知。

我相信,此功能將成爲JDK 7的一部分,這意味着您稍後可以在以後刪除對jnotify的依賴。

+0

Oy,他們把它命名爲jnotify?我想現在會出現pnotify,knotify,qnotify等等? – Duck 2011-04-22 15:52:46

0

考慮用臨時名稱寫入文件,寫入完成後,將文件重命名/移動到最終名稱/位置。

相關問題