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

时间:2012-01-10 11:22:00

标签: java locking nio nio2 watchservice

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

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

  

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

使用

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

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

谢谢!

2 个答案:

答案 0 :(得分:1)

您是否尝试过自己锁定文件?我认为如果它没有锁定并存在,你只能获得一个锁。

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

答案 1 :(得分:0)

跨进程共享文档很棘手,尤其是在不使用专用文件系统时(如GFS可以)..我不认为Java锁定API可能会对您有所帮助,我认为您的想法是正确的尝试/失败策略...使用java 7,您可以使用WatchService监视文件更改,然后按照您的业务要求进行操作...您使用什么类型的系统? Windows在永恒期间保留文件句柄......

HTH 杰罗姆