4

基本上,我使用全新的 Java 7 WatchService 来监视目录。

我有一个处理程序链,监听目录发出的每个 IO 事件。

问题是一些处理程序需要以某种方式更改这些 IO 事件(== 文件)的原因。例如,如果有人将文件放入受监视的文件夹中,则其中一个处理程序可能会更改其扩展名,将某些内容附加到其文件名或其他内容。

这些动作当然会触发新的 IO 事件,并且前面提到的处理程序会得到它们。然后他们再次进行更改。这显然会导致无限循环......

Java 是否提供任何方法来处理这种情况?如果没有,您将如何处理?

基本上,我只想在事件不是由这些处理程序的操作引起时才运行我的事件处理程序。

更新:至于解决方案,我宁愿只在主事件路由器的代码中进行更改,也不愿在我编写的每个处理程序中担心这一点(“处理程序只有在以前没有做过的情况下才会进行更改”)。

4

2 回答 2

4

如果没有基本情况,这只会导致无限循环。

假设人们将文件放在扩展名为“.bar”的目录中,而您想要扩展名为“.foo”,那么当且仅当当前扩展名为“.bar”时,您的处理程序才会进行更改。

即使您的处理程序仍会为 new 获取事件<file>.foo,您也可以丢弃它,停止“无限”事件传播。

于 2011-12-03T16:34:18.320 回答
0

我建议每次处理事件的代码都会触发新事件时使用新线程。在您的事件句柄中检查更改的文件是否需要重命名,如果是,则启动一个新线程进行重命名,如果不是从事件返回。这样做可以避免无限循环,因为事件处理代码会以任何方式退出。

于 2011-12-03T18:34:33.233 回答