1

我正在尝试使用 Java 7 和 WatchService 来监视何时将文件夹添加到文件夹中(通过从不同位置复制),然后我想对新创建的文件夹中的文件进行操作。

在 OSX 上,它按我的预期工作,在复制文件夹及其内容之前,我不会收到新文件夹创建的通知。但是在 Windows 上,我在文件夹的内容被复制之前收到了关于文件夹创建的关键事件,所以当我尝试处理文件夹中的文件时,那里不存在,通常只有第一个文件在那里。

我目前的解决方法是在收到文件夹通知后,我睡了 10 秒钟以等待其中的文件被复制,但这不是很令人满意,因为文件夹的大小可能会有很大差异,所以我睡眠时间不够长或时间太长大多数时候。

为什么 OSX 和 Windows 之间存在差异,如何解决我在 Windows 上的问题?

4

1 回答 1

0

WatchService 旨在某种程度上依赖于平台。从Java 7 API 文档

    The implementation that observes events from the file system is 
    intended to map directly on to the native file event notification 
    facility where available, or to use a primitive mechanism, such as 
    polling, when a native facility is not available. Consequently, many 
    of the details on how events are detected, their timeliness, and 
    whether their ordering is preserved are highly implementation specific.

考虑以下两种情况。

  • 比休眠时间更长的单个复制操作。
  • 多个复制操作到同一个文件夹。

如果您响应文件夹内容的创建而不是文件夹本身,那么您将涵盖这两种情况。您还可以消除睡眠中固有的竞争条件。

于 2012-10-22T18:09:06.217 回答