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

syl*_*ain 9 java nio locking watchservice nio2

我在一个应用程序中遇到一个经常出现的问题,该应用程序基于Java 7 WatchService API跟踪目录中文件的内容.当底层文件系统触发文件的修改事件时,我想立即计算其SHA-256.

但是经常发生另一个进程打开文件(即Word),从而扣留了一个独占锁并阻止我的应用程序进行任何读/写操作.如果针对打开的文件创建了任何Stream/Channel,则会抛出一个类似于以下消息的FileNotFoundException或者用于nio API的FileSystemException:

该进程无法访问该文件,因为该文件正由另一个进程使用

当文件实际上不存在于fs上时,我无法提供能够检测到这种情况而不屏蔽"真正的"FileNotFoundException的解决方案.

我想出了通过File.exists检查存在的想法,然后如果在打开流时抛出FileNotFoundException,我将能够推断该文件已被锁定.我愿意接受任何意见!

谢谢!

Pet*_*rey 1

您是否尝试过自己锁定文件?我假设您只能在未锁定且存在的情况下获取锁。

http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#tryLock%28%29