3

このJava の例を見ると、キーの状態について、オラクルは次のように述べています。

Readyは、キーがイベントを受け入れる準備ができていることを示します。最初に作成されたとき、キーは準備完了状態にあります。

Signaledは、1 つ以上のイベントがキューに入れられていることを示します。キーが通知されると、reset メソッドが呼び出されるまで、キーは準備完了状態ではなくなります。

WatchKeyjavadocで:

キーがシグナル状態にある間に検出されたイベントはキューに入れられますが、監視サービスから取得するためにキーが再度キューに入れられることはありません

key.pollEvents()ドキュメントには、 と の間で生成されたイベントがどうなるかは記載されていませんkey.reset()キーがリセットされるまでイベントはバッファリングされ、キーはリセット直後に通知されると想定されています。これは、以下のテストでサポートされているようです。

公式ドキュメントを教えていただけますか?またはドキュメントの欠如についての議論に?


Path dir = Paths.get("test");
WatchService watcher = dir.getFileSystem().newWatchService();
dir.register(watcher, CREATE, DELETE, MODIFY);
while (true) {
    WatchKey key = watcher.take();
    System.out.println("polling.");
    for (WatchEvent<?> event : key.pollEvents()) {
        ... (details removed) ...
        System.out.format("  Event %s in [%s] for entry [%s]%n",
                          event.kind().name(), registeredDir, childPath);
        try { Thread.sleep(20000); } catch (InterruptedException e) { ; }
    }
    System.out.println("resetting.");
    key.reset();
}

... によって許可された 20 代以内にsleep()、私は次のことを行いました。

  • ファイルを作成し、
  • 編集して、保存して、
  • 名前を変更し、
  • 編集して、保存して、
  • 消して

出力:

polling.
  Event ENTRY_CREATE in [test] for entry [test\file1.txt]
resetting.
polling.
  Event ENTRY_MODIFY in [test] for entry [test\file1.txt]
  Event ENTRY_DELETE in [test] for entry [test\file1.txt]
  Event ENTRY_CREATE in [test] for entry [test\file2.txt]
  Event ENTRY_MODIFY in [test] for entry [test\file2.txt]
  Event ENTRY_DELETE in [test] for entry [test\file2.txt]
resetting.

わかりました。

4

1 に答える 1

0

追加のイベントがバッファリングされ、バッファがいっぱいになると処理されるか、イベント タイプが OVERFLOW になるようです。

watchservice のドキュメントから:

「ファイルシステムは、取得または処理できるよりも速くイベントを報告する可能性があり、実装は、蓄積できるイベントの数に不特定の制限を課す可能性があります。実装が故意にイベントを破棄する場合、キーの pollEvents メソッドが要素を返すように手配します。イベント タイプが OVERFLOW の場合。このイベントは、コンシューマーがオブジェクトの状態を再調査するためのトリガーとして使用できます。」

于 2014-06-21T13:59:22.037 に答える