我有一個將文件寫入磁盤的Java應用程序。問題是,Linux不像Windows那樣鎖定文件,所以有人可以在文件寫入時刪除它。當發生這種情況時,我的Java應用程序一直在繼續,就像文件仍然存在一樣......甚至允許寫入更多,但沒有例外。Linux上的Java寫入文件被刪除,但我仍然可以寫入它
我添加了一個檢查:file.exists(),但是這使我的表現幾乎殺死了50%。任何人有什麼聰明的想法,我可以如何解決這個問題,並保持我的表現高?
我有一個將文件寫入磁盤的Java應用程序。問題是,Linux不像Windows那樣鎖定文件,所以有人可以在文件寫入時刪除它。當發生這種情況時,我的Java應用程序一直在繼續,就像文件仍然存在一樣......甚至允許寫入更多,但沒有例外。Linux上的Java寫入文件被刪除,但我仍然可以寫入它
我添加了一個檢查:file.exists(),但是這使我的表現幾乎殺死了50%。任何人有什麼聰明的想法,我可以如何解決這個問題,並保持我的表現高?
unix下的「文件」是一個未命名的i節點(其中包含數據)以及指向該i節點的目錄中的零+條目。零或更多。這意味着您可以刪除名稱,但是i節點仍然存在,如果打開,可以寫入並從中讀取。
但是,在每次寫入時不需要檢查f.exists()。偶爾做一次(比如說15秒一次)。你的表現不會傷害太多。
不幸的是,這不是一個選項,因爲我們不能錯過任何東西。我認爲唯一的解決方案是使用文件權限作爲停止差距。感謝您的幫助 – user671731 2011-04-22 15:46:13
權限不會幫助您。根或組員會刪除你的文件就好了。 – 2011-04-22 15:47:45
是的,我明白了,但性能影響太大,無法在每次寫入之前檢查文件是否存在。只要不得不交叉手指,並希望沒有意外刪除。 – user671731 2011-04-22 16:27:24
聽說這被認爲是一個「問題」很有趣 - 我們這些在UNIX上cut牙咧咧的人認爲Windows的文件鎖定方法是粗糙和痛苦的。
如果您不能使用文件權限(大部分)防止這種情況,我認爲File.exists()是唯一的解決方案在這裏,但想必你可能不經常調用它,如果它導致性能問題 - 也許從一個「收割者」線程偶爾醒來檢查這種情況。
感謝您的回覆。我不認爲這是一個文件沒有「鎖定」的問題,我只是認爲這是一個問題,Java不會出錯。我想知道如何寫入一個不存在的文件。操作系統不會在已刪除的文件上丟棄文件句柄? – user671731 2011-04-22 15:01:20
請注意,這根本不是Java的東西 - 所有的代碼都會做同樣的事情。至於它是如何工作的:只要任何進程引用文件,文件的內核數據結構就不會消失。 UNIX是圍繞着一切都是文件 - 終端,網絡,各種設備,甚至是「/ dev/null」這個無處不在的特殊文件 - 所以寫入文件的概念物理上的存在並不是外來的。 – 2011-04-22 15:22:48
文件仍然存在,只有它的名字消失了。學習Unix兄弟! ;) – 2011-04-22 15:43:29
考慮用臨時名稱寫入文件,寫入完成後,將文件重命名/移動到最終名稱/位置。
我們在我們的產品中遇到了同樣的問題 - 我們最終將其記錄爲限制。 – AbdullahC 2011-04-22 14:53:42
您可以使用組權限並鎖定目錄。您的程序可能是具有適當權限的組中唯一的用戶。這是一個混亂,但它可能有助於減少意外刪除。 – karakuricoder 2011-04-22 15:07:14
權限不會幫助。畢竟,root(例如)擁有所有權力。 – 2011-04-22 15:45:33