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

9
我有一个监视文件夹的watch服务。一旦创建文件,我就会处理目录并更新树形视图。这在ENTRY_DELETE上很好用,但是有时(不总是)当WatchEvent发生ENTRY_CREATE事件时,该文件还没有被写入磁盘。我通过创建一个new File()来确认这一点,该文件包含所注册的监视服务的目录以及文件的路径,并检查exists() 方法,因此似乎操作系统在实际创建文件之前触发了创建事件。这个问题看起来是相同的问题,但从文件夹的角度来看。有什么办法可以解决这个问题吗?

看看这个答案,似乎你也遇到了同样的问题。 - mindas
它确实可以 - 我会再等一下,以防出现更好的解决方案。 - Evan Knowles
2个回答

15

当创建一个文件时,会触发此事件。文件需要在被写入之前被创建。文件不会在完全被写入后立即出现,而是在被创建后出现。

一旦获取到创建事件,您可以执行以下操作:

  • 创建一个指向文件的File对象
  • 使用RandomAccessFilerw模式(即读和写访问权限)创建一个java.nio.channels.FileChannel用于随机访问
  • 锁定该通道。这将阻塞直到文件可以进行读/写访问(有关更多信息,请阅读更一般的Lock方法)
  • 当获得锁时,您的文件已由编写文件的进程释放

以下是一个简化的示例:

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

我只能在20小时后颁发悬赏,届时我会这样做。 - Evan Knowles

-1

我曾经遇到过同样的问题,我在事件创建后添加了几秒钟的延迟再进行处理。因为其他应用程序用于写入文件,需要几秒钟来刷新内容并释放文件。


问题是,我需要尽可能保持响应性,因此我正在寻找一种方式来最小化延迟。 - Evan Knowles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接