5

我正在使用 Java 7 WatchService 来监视目录。我不断更改我正在观看的目录。我遇到了异常:

java.io.IOException:已达到网络 BIOS 命令限制。

在 50 个目录之后。我确定在创建新的 WatchService 之前,我会在创建的每个 WatchService 上调用 close() 。

有谁知道释放 WatchService 的正确方法,这样你就不会遇到这个限制?

谢谢,

戴夫

4

2 回答 2

3

认为您需要做的就是close()服务。我知道你说过你认为你已经这样做了,但我怀疑你错过了一些。例如,您可能无法在出现异常的情况下关闭服务实例。您应该将 WatchService 实例视为其他 IO 资源并在 finally 块中关闭它;例如

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

或使用 Java 7“尝试资源”语法。

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

WatchService它关闭时,它应该立即释放它持有的任何 O/S 级资源。


唯一的另一种可能性是您在WatchService实现中遇到了一些 Java 错误。

于 2012-07-07T07:08:20.097 回答
2

如果我正确地阅读了 Javadoc,那么您只需要一个 WatchService,您可以在开始时实例化它,并在应用程序结束时关闭()。

您通过 .register 提交您想要一次注册一个的路径和事件,并取回一个 WatchKey。您将这些 WatchKeys 保留在周围,可能在由 Path 键入的 ConcurrentMap 中。

当您想删除一个时,只需在 WatchKey 上调用 cancel() 并从 Map 中删除。

观察服务

路径注册

监视键

于 2012-07-07T16:58:53.687 回答