使用从WatchService获取的Path的RandomAccessFile的FileNotFound异常?

时间:2013-12-05 17:33:43

标签: java filenotfoundexception java-8 randomaccessfile

为什么从RandomAccessFile(path.toFile(),"rw")返回的FileNotFoundException获得Path WatchServiceWatchEvent种类为ENTRY_CREATE

java.io.FileNotFoundException: 
C:\SharedFolders\FromS01\SSLServer01\SSLInternal02\DOMAIN\EML\E6046292.723
(The process cannot access the file because it is being used by another process)
    at java.io.RandomAccessFile.open(Native Method) ~[na:1.8.0-ea]
    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:236) ~[na:1.8.0-ea]
    at cbbb.filejobs.Main.fileCopied(Main.java:446) ~[CbbbFileJobs.jar:na]
    at cbbb.filejobs.Main.processFilesPending(Main.java:409) ~[CbbbFileJobs.jar:na]
    at cbbb.filejobs.Main.handleFileTasks(Main.java:156) ~[CbbbFileJobs.jar:na]

1 个答案:

答案 0 :(得分:0)

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

事实证明,使用WatchService事件时,文件在创建时不一定可用。

有时,操作系统在文件创建事件发生时就处于中间状态。

在我的情况下,解决方案是:

1)注意MODIFIED事件。 所有包含内容的文件都将包含CREATED,后跟MODIFIED。

2)检查文件是否再次存在(如果在CREATED之后立即删除)。然后重试以获取RandomAccessFile。这从未发生过,但我认为它可以 - 理论上。

3)如果文件是使用操作系统独占/共享锁定存放的。如果另一个进程仍有句柄,则无法获得锁定。

什么是有趣的......实际上是错误的......我之前能够将文件锁定为独占(并且共享工作),当它刚刚创建时。但文件内容始终为空。

所以,似乎在CREATE之后立即锁定并不总是有效。在尝试锁定之前等待MODIFIED似乎解决了这个问题。

真的,异常不应该是FileNotFound,而是FileInUse或FileNotAccessible ......