2012-07-07 6 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 (WatchService ws = ...) { 
    // use it ... 
} 

WatchServiceが閉鎖されると、それはすぐにそれが保持している任意のO/Sレベルのリソースを解放する必要があります。


唯一の他の可能性はあなたがWatchService実装では、いくつかのJavaバグに遭遇しているということです。

1

私がJavadocの権利を読んでいる場合は、ウォッチ・サービスが1つだけ必要です。このウォッチ・サービスは、アプリケーションの最後にstartおよびclose()でインスタンス化します。

一度に1つずつ登録するパスとイベントを登録してから、WatchKeyを取得します。これらのWatchKeysは、おそらくPathによってキーが設定されたConcurrentMapに保持されます。

削除する場合は、ウォッチキーでcancel()を呼び出してマップから削除するだけです。

WatchService

Path.Register

WatchKey

関連する問題