Java I/O:在任何读写操作之前确保文件未被其他进程锁定

9
我在使用Java 7 WatchService API跟踪目录中文件内容的应用程序中遇到了一个反复出现的问题。当底层文件系统在文件上触发修改事件时,我想立即计算其SHA-256。
但经常出现另一个进程打开了该文件(例如Word),从而持有独占锁,防止我的应用程序进行任何读/写操作。如果针对已打开的文件创建任何Stream/Channel,则会抛出FileNotFoundException或nio API的FileSystemException,并显示以下消息:
“因为它正在被另一个进程使用,所以无法访问该文件”
我不能提供一种解决方案,可以在文件实际上不存在于fs时掩盖“真正”的FileNotFoundException以检测这种情况。
我想通过File.exists来检查文件的存在性,然后如果我打开一个流时抛出FileNotFoundException,我就能推断出该文件已被锁定。欢迎提出任何意见!
谢谢!

你有找到解决方案吗? - Domenic D.
最终我使用了提到的启发式方法,如果在FileNotFoundException捕获块中File.exists返回true,则将其解释为文件已锁定。 - sylvain
2个回答

1

由于我尝试通过RandomAccessFile或FileOutputStream获取FileChannel时会抛出异常,因此我无法调用tryLock()。 - sylvain
在这种情况下,听起来你需要检查访问这些文件时抛出的异常。如果文件已被锁定,则无法调用tryLock,因此我不明白它的意义。 - Peter Lawrey
1
我的猜测是本地应用程序可以比JVM中可用的锁更加严格。 - sylvain

0

在没有使用专用文件系统(如GFS)的情况下,跨进程共享文档是棘手的。我认为Java锁定API可能帮不上你什么忙,但我认为你的尝试/失败策略是正确的思路...使用Java 7,您可以使用WatchService监视文件更改,然后根据业务要求进行操作...您使用什么样的系统?Windows会永久保留文件句柄...

希望对你有所帮助 Jerome


实际上,我已经有一个WatchService线程在监听FS事件,目前仅在Windows上运行。无论如何,我知道没有办法访问那些被锁定的文件,但我很惊讶java.io或java.nio中没有API来测试它们的可访问性。 - sylvain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接