5

Java 7 WatchService を使用してディレクトリを監視しています。監視しているディレクトリを常に変更します。私は例外に遭遇します:

java.io.IOException: ネットワーク BIOS コマンドの制限に達しました。

50 ディレクトリの後。新しいものを作成する前に、作成した各 WatchService で close() を呼び出すことは確かです。

この制限に遭遇しないように、WatchService を解放する適切な方法を知っている人はいますか?

ありがとう、

デイブ

4

2 に答える 2

3

私はあなたがする必要があるclose()のはサービスだけだと思います。あなたはすでにこれをしていると思っているとあなたが言ったことは知っていますが、あなたはいくつかを逃しているのではないかと思います。たとえば、例外が発生した場合にサービスインスタンスを閉じることができない可能性があります。WatchServiceインスタンスを他のIOリソースとして扱い、finallyブロックで閉じる必要があります。例えば

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

または、Java7の「リソースで試す」構文を使用します。

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

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


WatchService他の唯一の可能性は、実装でJavaのバグに遭遇したことです。

于 2012-07-07T07:08:20.097 に答える
2

私が Javadoc を正しく読んでいる場合、アプリの開始時にインスタンス化し、終了時に close() する WatchService が 1 つだけ必要です。

一度に 1 つずつ登録するパスとイベントを .register 経由で送信し、WatchKey を取得します。これらの WatchKey は、おそらく Path をキーとする ConcurrentMap に保持します。

削除したい場合は、WatchKey で cancel() を呼び出し、Map から削除します。

ウォッチサービス

パス.レジスタ

ウォッチキー

于 2012-07-07T16:58:53.687 に答える