Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java7WatchService:在处理程序中更改事件源时避免事件的无限循环_Java_Nio_Java 7_Watchservice - Fatal编程技术网

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

Java7WatchService:在处理程序中更改事件源时避免事件的无限循环,java,nio,java-7,watchservice,Java,Nio,Java 7,Watchservice,基本上,我使用全新的Java的7 WatchService来监视目录 我有一个处理程序链,监听目录发出的每个IO事件 问题是一些处理程序需要以某种方式更改这些IO事件(=文件)的原因。例如,如果有人将一个文件放入受监视的文件夹,其中一个处理程序可能会更改其扩展名、在其文件名中附加某些内容或其他内容 这些操作当然会触发新的IO事件,前面提到的处理程序会得到它们。然后他们再次做他们的改变。这显然会导致一个无限循环 Java是否提供了处理这种情况的方法?如果没有,你会如何处理 基本上,我只希望在事件不

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

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

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

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

Java是否提供了处理这种情况的方法?如果没有,你会如何处理

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


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

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

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


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

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

这个问题仍然有价值。假设您希望对放置在监视目录中的所有文件执行操作,然后执行可能不容易检测到的操作。所以你只想对外部调用者的修改采取行动。@jontro:关键是,对于你自己生成事件的情况,并且这种生成可能会导致无限循环,你必须有一个基本情况,就像递归一样。是的,当然有,但正如乔特罗所说,只有在有外部来电的情况下才采取行动似乎是合理和可能的。我宁愿只更改主事件路由器的代码,也不愿担心我编写的每个处理程序都会出现这种情况。@PawełBara,如果其他人修改了文件,然后你修改了文件,从而生成了事件,这正是我所描述的。你需要一个基本案例。只有当您知道什么会导致本地事件触发时,基本情况才能合理存在,例如,在处理程序中。我怀疑您必须根据您以前的操作跟踪您希望在处理程序中忽略哪些事件。如果马克·埃利奥特的答案是可能的,最简单的方法就是。一条新的线索?线程占用大量系统内存,特别建议不要使用超过需要的线程。说真的,别这么做,反正也解决不了。