Linux上的Java写入文件被删除但我仍然可以写入它

时间:2011-04-22 14:49:31

标签: java linux performance

我有一个将文件写入磁盘的Java应用程序。问题是,Linux不像Windows那样锁定文件,因此有人可以在写入文件时删除该文件。发生这种情况时,我的Java应用程序会像文件仍然存在一样继续...甚至允许更多写入,没有异常。

我添加了一个检查:file.exists(),但这会使我的性能下降近50%。任何人都有任何聪明的想法,我如何解决这个问题,并保持我的表现高?

4 个答案:

答案 0 :(得分:7)

听到这被认为是一个“问题”很有趣 - 我们这些在UNIX上开口的人认为Windows的文件锁定方法是粗暴而痛苦的。

如果你不能使用文件权限(大多数情况下)阻止这种情况,我认为File.exists()是这里唯一的解决方案,但是如果它导致性能问题,你可能会更少地调用它 - 可能来自“收割者”线程偶尔醒来检查这种情况。

答案 1 :(得分:2)

如果您不介意减少程序的可移植性,可以在删除文件时通知jnotify之类的内容。

我相信这个功能将成为JDK 7的一部分,这意味着您以后可以删除对jnotify的依赖。

答案 2 :(得分:2)

unix下的“文件”是一个未命名的i节点(包含数据)和指向该i节点的目录中的零+条目。零或更多。这意味着您可以删除名称,但i-node仍然存在,如果打开,可以写入并从中读取。

但是你不需要在每次写入时检查f.exists()。偶尔做一次(让我们说15秒一次)。你的表现不会受到太大伤害。

答案 3 :(得分:0)

考虑使用临时名称编写文件,写完成后,将文件重命名/移动到其最终名称/位置。