我有一个将文件写入磁盘的Java应用程序。问题是,Linux不像Windows那样锁定文件,因此有人可以在写入文件时删除该文件。发生这种情况时,我的Java应用程序会像文件仍然存在一样继续...甚至允许更多写入,没有异常。
我添加了一个检查:file.exists(),但这会使我的性能下降近50%。任何人都有任何聪明的想法,我如何解决这个问题,并保持我的表现高?
答案 0 :(得分:7)
听到这被认为是一个“问题”很有趣 - 我们这些在UNIX上开口的人认为Windows的文件锁定方法是粗暴而痛苦的。
如果你不能使用文件权限(大多数情况下)阻止这种情况,我认为File.exists()是这里唯一的解决方案,但是如果它导致性能问题,你可能会更少地调用它 - 可能来自“收割者”线程偶尔醒来检查这种情况。
答案 1 :(得分:2)
如果您不介意减少程序的可移植性,可以在删除文件时通知jnotify之类的内容。
我相信这个功能将成为JDK 7的一部分,这意味着您以后可以删除对jnotify的依赖。
答案 2 :(得分:2)
unix下的“文件”是一个未命名的i节点(包含数据)和指向该i节点的目录中的零+条目。零或更多。这意味着您可以删除名称,但i-node仍然存在,如果打开,可以写入并从中读取。
但是你不需要在每次写入时检查f.exists()。偶尔做一次(让我们说15秒一次)。你的表现不会受到太大伤害。
答案 3 :(得分:0)
考虑使用临时名称编写文件,写完成后,将文件重命名/移动到其最终名称/位置。