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

我有一个将文件写入磁盘的Java应用程序。 问题是,Linux不像Windows那样locking文件,所以有人可以在写入文件时删除文件。 当发生这种情况时,我的Java应用程序保持一致,就像文件仍然存在…甚至允许更多的写入,没有例外。

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

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

但是在每次写入时你都不需要检查f.exists()。 偶尔做一次(比如15秒一次)。 你的表现不会伤害太多。

听说这被认为是一个“问题”,这很有趣 – 我们这些在UNIX上斩钉截铁的人认为Windows的文件锁定方法是粗糙和痛苦的。

如果你不能使用文件权限来(主要是)防止这种情况,我认为File.exists()是唯一的解决方案,但是如果它导致性能问题,你可能会调用它不太频繁 – 也许从“收割者”线程,偶尔醒来检查这种情况。

如果你不介意减少你的程序的可移植性,你可以使用jnotify之类的东西在文件被删除时得到通知。

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

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