4

基本的に、新しい Java の 7 WatchService を使用してディレクトリを監視しています。

ディレクトリによって発行されたすべての IO イベントをリッスンするハンドラーのチェーンがあります。

問題は、一部のハンドラーが何らかの方法でこれらの IO イベント (== ファイル) の理由を変更する必要があることです。たとえば、誰かがファイルを監視対象のフォルダーに入れると、ハンドラーの 1 つが拡張子を変更したり、ファイル名に何かを追加したりします。

もちろん、これらのアクションは新しい IO イベントをトリガーし、前述のハンドラーがそれらを取得します。その後、彼らはもう一度変更を行います。これは明らかに無限ループにつながります...

Java はこの種の状況を処理する方法を提供していますか? そうでない場合、これにどのように対処しますか?

基本的に、イベントがそれらのハンドラーのアクションによって引き起こされなかった場合にのみ、イベントハンドラーを実行したいと思います。

更新:解決策については、私が書くすべてのハンドラーでこれを心配するよりも、メインイベントルーターのコードでのみ変更を加えたいと思います(「ハンドラーは以前に変更しなかった場合にのみ変更を加えます」)。

4

2 に答える 2

4

これは、基本ケースがない場合にのみ無限ループにつながります。

人々が拡張子「.bar」のディレクトリにファイルを置き、拡張子「.foo」が必要だとすると、現在の拡張子が「.bar」である場合にのみ、ハンドラーはその変更を行います。

ハンドラーは引き続き new のイベントを取得し<file>.fooますが、それを破棄して、「無限の」イベントの伝播を停止できます。

于 2011-12-03T16:34:18.320 に答える
0

イベントを処理するコードが新しいイベントをトリガーするたびに、新しいスレッドを使用することをお勧めします。イベントハンドル内で、変更されたファイルの名前変更が必要かどうかを確認します。必要な場合は、名前変更を行う新しいスレッドを開始します。そうでない場合は、イベントから戻ります。これを行うと、イベント処理コードが何らかの方法で終了するため、無限ループを回避できます。

于 2011-12-03T18:34:33.233 に答える