Java 7中WatchService的资源释放问题

5
我正在使用Java 7 WatchService监视目录。我不断更改我正在观察的目录。当达到50个目录时,我遇到了以下异常:java.io.IOException:已达到网络BIOS命令限制。我确定在创建新的WatchService之前,我会调用close()关闭每个WatchService。有人知道释放WatchService的正确方法,以避免遇到此限制吗?谢谢,Dave。
2个回答

3

我认为你只需要执行close()方法关闭服务即可。虽然你可能认为已经这样做了,但我怀疑你可能会有遗漏。比如,在发生异常的情况下,你可能没有关闭服务实例。应该像处理其他IO资源一样,使用finally块关闭WatchService实例,例如:

WatchService ws = ...
try {
    // use it ...
} finally {
    ws.close();
}

或者使用Java 7的“try with resource”语法。

try (WatchService ws = ...) {
    // use it ...
}

WatchService 被关闭时,它应立即释放它所持有的任何操作系统级别的资源。
唯一的其他可能性是您遇到了 WatchService 实现中的一些 Java 错误。

2
如果我理解Javadoc正确的话,你只需要一个WatchService,在应用程序启动时实例化它,并在结束时调用close()方法。
你可以通过.register方法逐个注册要注册的路径和事件,并获得一个WatchKey。你可以将这些WatchKey保存下来,例如在一个以Path为键的ConcurrentMap中。
当你想要删除其中一个时,只需调用WatchKey的cancel()方法并从Map中移除即可。 WatchService

Path.Register

观看密钥


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接