【问题标题】:Releasing resources of Java 7 WatchServiceJava 7 WatchService 释放资源
【发布时间】:2012-07-07 06:41:38
【问题描述】:

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

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

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

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

谢谢,

戴夫

【问题讨论】:

    标签: java watchservice


    【解决方案1】:

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

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

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

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

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


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

    【讨论】:

      【解决方案2】:

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

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

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

      WatchService

      Path.Register

      WatchKey

      【讨论】:

        猜你喜欢
        • 2013-10-09
        • 2012-01-08
        • 2012-05-04
        • 1970-01-01
        • 2018-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多