基本上,我使用新的Java的7 WatchService来监视目录。
我有一个处理程序链,监听由目录发出的每个IO事件。
问题是一些处理程序需要以某种方式改变那些IO事件(==文件)的原因。例如,如果有人将一个文件放入受监视的文件夹中,其中一个处理程序可能会更改它的扩展名,在它的文件名中附加一些东西,或者诸如此类。
这些操作当然会触发新的IO事件,并且上述处理程序会获取它们。然后再做一次修改。这显然会导致无限循环…Java提供任何方法来处理这种情况吗?如果不是,你会如何处理?
基本上,我想只在事件不是由这些处理程序的操作引起时才运行我的事件处理程序。
UPDATE:至于解决方案,我宁愿只在主事件路由器的代码中进行更改,而不是在我编写的每个处理程序中担心这一点("处理程序只在以前没有做过的情况下进行更改")。
这只会在没有基准情况下导致无限循环。
假设人们把文件放在扩展名为'的目录下。Bar ',你想要extension '。Foo ',当且仅当当前扩展名为'.bar'时,处理程序才会更改。
即使处理程序仍然会获得新的<file>.foo
的事件,您也可以丢弃它,停止"无限"事件传播。
我建议使用一个新的线程,每次你的代码处理一个事件将触发一个新的事件。在事件句柄中检查更改的文件是否需要重命名,如果是,则启动一个新线程进行重命名,如果没有从事件返回。这样做可以避免无限循环,因为事件处理代码以任何方式退出。