2012-07-07 80 views
5

我正在使用Java 7 WatchService来查看目录。我经常更改我正在观看的目录。我遇到了异常:释放Java 7 WatchService的资源

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

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

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

感谢,

戴夫

回答

3

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

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

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

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

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


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

1

如果我正在阅读Javadoc权限,则只需要一个WatchService,它在应用程序结束时在start和close()处实例化。

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

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

WatchService

Path.Register

WatchKey