我在使用WatchService时遇到了问题。这是我的一段代码片段:
问题出在这里。看起来线程通过这行的速度非常快,导致两个“CREATED”事件滞后并丢失,只有一个被接受。解决方法是在这一行的正上方添加一行额外的代码,就像这样:
这似乎是一个解决方案,至少对于三个或更多个同时打开的文件来说是有效的,但它根本不具备可扩展性。
总之,我想知道是否有更好的解决方案。顺便提一下,我正在运行 Win 7 64。
非常感谢您的帮助!
public void watch(){
//define a folder root
Path myDir = Paths.get(rootDir+"InputFiles/"+dirName+"/request");
try {
WatchService watcher = myDir.getFileSystem().newWatchService();
myDir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE);
WatchKey watckKey = watcher.take();
List<WatchEvent<?>> events = watckKey.pollEvents();
for (WatchEvent event : events) {
//stuff
}
}catch(Exception e){}
watckKey.reset();
}
首先,了解到watch()是在一个无限循环中调用的。
问题在于当同时创建多个文件时,有些事件会丢失。例如,如果我将三个文件复制粘贴到“.../request”文件夹中,只有一个文件被捕获,其他文件则像什么都没有发生一样,也不会触发OVERFLOW事件。在某些不同的计算机和操作系统上,最多可以捕获两个文件,但如果尝试3个或更多文件,则其余文件仍然无法触发。
我找到了一个解决方法,但我不认为它是最佳实践。这是流程:
进程开始,然后停在
WatchKey watckKey = watcher.take();
如预期的那样(根据处理事件),然后我将三个文件一起放入“请求”文件夹中,因此,处理过程在此恢复。
List<WatchEvent<?>> events = watckKey.pollEvents();
问题出在这里。看起来线程通过这行的速度非常快,导致两个“CREATED”事件滞后并丢失,只有一个被接受。解决方法是在这一行的正上方添加一行额外的代码,就像这样:
Thread.sleep(1000);
List<WatchEvent<?>> events = watckKey.pollEvents();
这似乎是一个解决方案,至少对于三个或更多个同时打开的文件来说是有效的,但它根本不具备可扩展性。
总之,我想知道是否有更好的解决方案。顺便提一下,我正在运行 Win 7 64。
非常感谢您的帮助!