为什么从RandomAccessFile(path.toFile(),"rw")
返回的FileNotFoundException
获得Path
WatchService
,WatchEvent
种类为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]
答案 0 :(得分:0)
“进程无法访问该文件,因为它正由另一个进程使用”
事实证明,使用WatchService事件时,文件在创建时不一定可用。
有时,操作系统在文件创建事件发生时就处于中间状态。
在我的情况下,解决方案是:
1)注意MODIFIED事件。 所有包含内容的文件都将包含CREATED,后跟MODIFIED。
2)检查文件是否再次存在(如果在CREATED之后立即删除)。然后重试以获取RandomAccessFile。这从未发生过,但我认为它可以 - 理论上。
3)如果文件是使用操作系统独占/共享锁定存放的。如果另一个进程仍有句柄,则无法获得锁定。
什么是有趣的......实际上是错误的......我之前能够将文件锁定为独占(并且共享工作),当它刚刚创建时。但文件内容始终为空。
所以,似乎在CREATE之后立即锁定并不总是有效。在尝试锁定之前等待MODIFIED似乎解决了这个问题。
真的,异常不应该是FileNotFound,而是FileInUse或FileNotAccessible ......