我只是按照本教程使用WatchService
API。我不知道为什么要使用WatchEvent<?>
而不是WatchEvent<Path>
,如果我使用后一种,则无需强制转换,或者还有其他WatchService
可以用来监视非Path事件的情况?
@SuppressWarnings("unchecked")
static <T> WatchEvent<T> cast(WatchEvent<?> event) {
return (WatchEvent<T>)event;
}
void processEvents() {
for (; ; ) {
...
//why doesn't the poolEvents() return WatchEvent<Path>
for (WatchEvent<?> event: key.pollEvents()) {
WatchEvent.Kind kind = event.kind();
...
//here he use a static method cast() to SuppressWarnings the unchecked warning
WatchEvent<Path> ev = cast(event);
}
}
}
WatchService的Javadoc说:
文件系统报告事件的速度可能快于对其进行检索或处理的速度,并且实现可能会对文件累积的事件数量施加未指定的限制。如果实现故意丢弃事件,则它安排键的pollEvents方法返回事件类型为OVERFLOW的元素。消费者可以使用此事件作为触发来重新检查对象的状态。
StandardWatchEventKinds.OVERFLOW是类型WatchEvent.Kind<Object>
,我相信这就是为什么pollEvents需要返回WatchEvent<?>
而不是的List的原因WatchEvent<Path>
。OVERFLOW的Javadoc还提到:
此事件的上下文是特定于实现的,可以为null
这就是为什么溢出事件的类型必须为的原因WatchEvent<Object>
。
请注意,您链接的教程建议以下内容:
通过使用kind方法检索事件的类型。无论密钥已注册了什么事件,都可能会收到OVERFLOW事件。您可以选择处理溢出或忽略它,但是您应该对其进行测试。
因此,您应该在代码中添加以下内容(如果尚未添加):
if (kind == OVERFLOW) {
continue;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句