在写入文件之前触发了Java 7 Watch Service ENTRY_CREATE

时间:2016-01-08 07:40:13

标签: java java-7 watchservice

我有观看目录的观看服务。创建文件后,我正在处理目录并更新树视图。

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

我已经通过创建监视服务注册目录的new File()以及文件路径并检查exists()方法来确认这一点,因此操作系统似乎正在触发实际创建文件之前的create事件。

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

我可以解决这个问题吗?

2 个答案:

答案 0 :(得分:9)

创建文件时会触发事件。在写入文件之前,需要先创建该文件。文件一旦完全写入就不会出现,一旦创建就会出现。

一旦你获得创作活动,你可以做的是:

  • 创建File对象以指向文件
  • 使用java.nio.channels.FileChannel rw模式创建RandomAccessFile随机访问权限(以便读取和写入权限)
  • Lock频道。这将阻止,直到文件可以进行读/写访问(阅读更通用的Lock方法以获取更多信息)
  • 获取锁定后,文件由写入文件的进程
  • 释放

简化示例:

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

答案 1 :(得分:0)

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