Java 7 WatchService:在处理程序中更改事件源时避免无限循环的事件

时间:2011-12-03 16:15:59

标签: java nio java-7 watchservice

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

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

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

这些操作当然会触发新的IO事件,前面提到的处理程序会获得它们。然后他们再次做出改变。这显然会导致无限循环......

Java是否提供任何方法来处理这种情况?如果没有,你会怎么处理这个?

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

更新:至于解决方案,我宁愿只改变主事件路由器的代码,而不是在我编写的每个处理程序中担心这一点(“处理程序仅在不执行时才进行更改“之前要做的”)。

2 个答案:

答案 0 :(得分:4)

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

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

即使您的处理程序仍然会获得新<file>.foo的事件,您也可以将其丢弃,停止“无限”事件传播。

答案 1 :(得分:0)

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