Java 7 监视服务 ENTRY_CREATE 在写入文件之前触发

Java 7 Watch Service ENTRY_CREATE triggered before file is written

我有一个监视目录的监视服务。创建文件后,我将处理目录并更新树视图。

这在 ENTRY_DELETE 上工作正常,但有时(并非总是)当出现 WatchEventENTRY_CREATE 时,文件尚未写入磁盘。

我已经通过创建手表服务注册目录的 new File() 以及文件路径并检查 exists() 方法来确认这一点,所以看起来 OS 在实际创建文件之前触发创建事件。

This question 似乎是同一个问题,但从文件夹的角度来看。

有什么办法可以解决这个问题?

我有同样的问题,我在处理之前创建事件后添加了几秒钟的延迟。由于其他应用程序用于写入文件,并且过去需要几秒钟来刷新内容并释放文件。

创建文件时触发该事件。该文件需要先创建,然后才能写入。文件不会在完全写入后出现,而是在创建后出现。

获得创建事件后,您可以做的是:

  • 创建一个File对象指向文件
  • 创建 java.nio.channels.FileChannel for random access using RandomAccessFilerw 模式(因此读写访问)
  • Lock the channel. This will block until the file is free for read/write access (read the more general Lock 方法获取更多信息)
  • 获得锁后,您的文件已被写入文件的进程释放

一个简化的例子:

File lockFile = new File( "file_to_lock" );
FileChannel channel = new RandomAccessFile( lockFile, "rw" ).getChannel( );
channel.lock( );