- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我刚刚关注了这个 tutorial使用WatchService
应用程序接口(interface)。我不知道为什么使用 WatchEvent<?>
而不是 WatchEvent<Path>
,如果我用的是后一种,就不用投了,或者有其他情况WatchService
可以用来监视非路径事件吗?
@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说:
File systems may report events faster than they can be retrieved or processed and an implementation may impose an unspecified limit on the number of events that it may accumulate. Where an implementation knowingly discards events then it arranges for the key's pollEvents method to return an element with an event type of OVERFLOW. This event can be used by the consumer as a trigger to re-examine the state of the object.
StandardWatchEventKinds.OVERFLOW类型为 WatchEvent.Kind<Object>
,我相信这就是为什么 pollEvents 需要返回 WatchEvent<?>
的列表而不是 WatchEvent<Path>
. OVERFLOW 的 Javadoc 还提到:
The context for this event is implementation specific and may be null
这就是为什么溢出事件的类型需要是 WatchEvent<Object>
的原因.
请注意,您链接的教程建议如下:
Retrieve the type of event by using the kind method. No matter what events the key has registered for, it is possible to receive an OVERFLOW event. You can choose to handle the overflow or ignore it, but you should test for it.
因此,您应该将以下内容添加到您的代码中(如果您还没有添加的话):
if (kind == OVERFLOW) {
continue;
}
关于java - 为什么 WatchService 使用未绑定(bind)的通配符 WatchEvent<?> 而不是 WatchEvent<Path>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24477601/
我刚刚关注了这个 tutorial使用WatchService应用程序接口(interface)。我不知道为什么使用 WatchEvent而不是 WatchEvent ,如果我用的是后一种,就不用投了
您将如何使用WatchEvent Java7的类? 我的意思是: for (WatchEvent event : key.pollEvents()) { final WatchEvent.Ki
我正在尝试在客户端和服务器之间同步两个文件夹及其子目录。我有this class的修改版本我在下面发布了。在我的 Client 类中,我创建一个 WatchDir 对象并在无限循环中调用其 proce
我有以下测试代码: FileSystem fs = FileSystems.getDefault(); Path conf = fs.getPath("."); WatchKey key = null
我有一个 WatchService监视 ENTRY_CREATE 的目录树, ENTRY_DELETE和 ENTRY-MODIFY事件。问题是 WatchEvent 的上下文只给出一个 Path 对象
我递归地观察一个目录(以及所有子目录和文件)的变化。 看来,如果我在根目录的子目录中创建或删除目录或文件以查看包含在 WatchEvent 实例中的路径,那么接收到的实例(通过上下文())没有父级,因
我正在编写一个程序,用于监视某个目录中是否有任何新文件,每当新文件到达时,程序就会对这些文件采取一些操作。我正在使用 WatchService 来监视该目录,因此我觉得可以最终证明该文件确实存在。 但
我正在使用 Java 7,java.nio.file.WatchEvent 以及 WatchService。注册后,当我轮询 ENTRY_MODIFY 事件时,我无法获取事件文件的绝对路径。有没有办法
在此代码中,我希望使用给定路径内容的最新版本更新 HashMap,并将绝对路径作为字符串用作键。问题是 WatchEvent 的 .context() 方法在每个事件上为同一文件提供了不同的相对路径。
我是一名优秀的程序员,十分优秀!