在一个基于Java 7 WatchService API跟踪目录中文件内容的应用程序中,我遇到了一个反复出现的问题。当底层文件系统在文件上触发修改事件时,我想立即计算它的SHA-256。
但通常情况下,另一个进程打开了文件(即Word),从而扣留了独占锁,并阻止了我的应用程序进行任何读/写操作。如果针对打开的文件创建了任何流/通道,则会引发针对nio API的FileNotFoundException或FileSystemException,并显示以下消息:
进程无法访问该文件,因为另一个进程正在使用该文件
当fs上实际上不存在文件时,我无法提供一个在不屏蔽"真实"FileNotFoundException的情况下检测此类情况的解决方案。
我想出了通过File.exists检查存在性的想法,然后如果在打开流时抛出FileNotFoundException,我就可以推断该文件已锁定。我对此持开放态度!
谢谢!
您自己尝试过锁定文件吗?我认为只有在锁未锁定且存在的情况下,您才能获得锁。
http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#tryLock%28%29
跨流程共享文档很棘手,尤其是在不使用专用文件系统的情况下(比如GFS)。。我不认为Java锁定API可能对您有多大帮助,我认为您对尝试/失败策略的想法是正确的。。。使用java7,您可以使用WatchService来监控文件更改,然后按照您的业务需求进行操作。。。你使用哪种系统?Windows永久保留文件句柄。。。
HTHJerome