問題タブ [watchservice]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - WatchService でサブディレクトリの変更を監視するにはどうすればよいですか? (ジャワ)
ディレクトリの変更とそのサブディレクトリを監視したい。これを実行しようとしましWatchService
たが、ファイルがどのディレクトリから変更されたのかわかりません。から完全なパスを取得するにはどうすればよいWatchEvent
ですか?
java - WatchServiceとSwingWorker:それを正しく行う方法は?
WatchServiceはエキサイティングなアイデアのように聞こえました...残念ながら、チュートリアル/ apiで警告されているほど低レベルであるように見えますが、Swingイベントモデルに実際には適合しません(または、ゼロではない確率で明らかな何かが欠けています
チュートリアルのWatchDirの例のコード(単一のディレクトリのみを処理するために単純化された)を使用すると、基本的には最終的に
- SwingWorkerを拡張する
- コンストラクターで登録作業を行います
- エンドレスループをdoInBackgroundにキーを待機させます
- key.pollEvents()を介して取得されたときに各WatchEventを公開します
削除/作成されたファイルをnewValueとしてpropertyChangeEventsを起動することにより、チャンクを処理します
/li>
基本的な考え方は、コードを使用して、ぬるぬるした詳細を幸福に認識しないようにすることです。プロパティの変更をリッスンし、fiは必要に応じて任意のモデルを更新します。
動作しているようですが、不快に感じます
- スレッドにとらわれない私は、これまでに見たすべてのサンプルスニペットは、watcher.take()を使用して待機中のスレッドをブロックします。なぜ彼らはそれをするのですか?少なくとも一部はwatcher.poll()を使用し、少し眠ることを期待します。
- SwingWorkerのpublishメソッドは完全には適合していないようです。今のところ、1つのディレクトリだけを監視しているので、問題ありません(間違った方向にあまり遠くまでギャロップしたくありませんでした:)複数のディレクトリを監視しようとする場合(元のWatchDirの例)いくつかのキーとそれらの1つに関連するWatchEventがあります。パスを解決するには、イベントとキーが監視しているディレクトリ[A]の両方が必要ですが、渡すことができるのは1つだけです。おそらく、ロジックの分散が間違っている可能性がありますが
[A]編集済み(@trashgodsのコメントによってトリガーされます)-実際には、イベントと一緒に渡さなければならないキーではなく、変更を報告しているディレクトリです。それに応じて質問を変更しました
参考までに、この質問はOTNスイングフォーラムにクロスポストされています
補遺
WatchKeyのAPIドキュメントを読む:
ウォッチサービスからシグナルキーを取得するスレッドが複数ある場合は、オブジェクトのイベントが処理された後にのみリセットメソッドが呼び出されるように注意する必要があります。
イベントがすべきであることを意味するようです
- WatchKeyを取得したのと同じスレッドで処理されます
- キーがリセットされた後は触れないでください
完全にはわかりませんが、@ Eelsのアドバイスに従うことを決定したディレクトリ(複数)を再帰的に監視するという(将来の)要件と組み合わせると、私が決めたコードがすぐに投稿されます
EDIT は私自身の答えを受け入れました-誰かが合理的な異議を唱えた場合、それを謙虚に元に戻します
java - Java 7 WatchService: ハンドラーでイベント ソースを変更するときにイベントの無限ループを回避する
基本的に、新しい Java の 7 WatchService を使用してディレクトリを監視しています。
ディレクトリによって発行されたすべての IO イベントをリッスンするハンドラーのチェーンがあります。
問題は、一部のハンドラーが何らかの方法でこれらの IO イベント (== ファイル) の理由を変更する必要があることです。たとえば、誰かがファイルを監視対象のフォルダーに入れると、ハンドラーの 1 つが拡張子を変更したり、ファイル名に何かを追加したりします。
もちろん、これらのアクションは新しい IO イベントをトリガーし、前述のハンドラーがそれらを取得します。その後、彼らはもう一度変更を行います。これは明らかに無限ループにつながります...
Java はこの種の状況を処理する方法を提供していますか? そうでない場合、これにどのように対処しますか?
基本的に、イベントがそれらのハンドラーのアクションによって引き起こされなかった場合にのみ、イベントハンドラーを実行したいと思います。
更新:解決策については、私が書くすべてのハンドラーでこれを心配するよりも、メインイベントルーターのコードでのみ変更を加えたいと思います(「ハンドラーは以前に変更しなかった場合にのみ変更を加えます」)。
java - マップされたドライブの監視中に Java WatchService がイベントを生成しない
ファイル ウォッチャーを実装しましたが、Java nio ファイル ウォッチャーが、マップされたドライブにコピーされているファイルのイベントを生成しないことに気付きました。たとえば、Unix でファイル ウォッチャーを実行して、/sharedfolder
Windows ( ) にマップされているローカル ディレクトリ ( ) を監視しH:\
、このディレクトリ ( H:\
) にファイルを配置しましたが、ファイル ウォッチャーはイベントを生成しませんでした。 . ここで、Windows でファイル ウォッチャーを実行しH:\
て、UNIX パス ( /sharedfolder
) を参照するマップされたドライブ ( ) を監視し、Unix からこのフォルダーにファイルを配置すると、ファイル ウォッチャーは変更を識別し、イベントを生成します。バグのように見えますか、何かが足りないのではないでしょうか?
java - Java ですべてのファイル ハンドルがいつ解放されるかを確認する
ディレクトリを監視したいのですが、そこにファイルが表示されたら、それを開いて処理し、別のディレクトリに移動します。問題は、他のプログラムが書き終わったことを確認する方法です。Java 7 では、FileSystem から WatchService を使用できますが、ファイルがいつ作成されたかを確認することしかできません。私が知りたいのは、すべてのファイル ハンドルがいつ解放されるかを知ることです。
最初は排他ロックを取得できるのではないかと思っていましたが、実際にファイルを更新している間に別のアプリケーションを追い出すことができることがわかりました。
Javaでこれを行うための推奨される方法は何ですか? ありがとう!
java - Java I/O: r/w 操作の前に、ファイルが別のプロセスによってロックされていないことを確認する
Java 7 WatchService API に基づいて、ディレクトリ内のファイルの内容を追跡するアプリケーションで、繰り返し発生する問題に遭遇しています。基盤となるファイル システムがファイルに対して変更イベントを発生させた場合、すぐにその SHA-256 を計算したいと考えています。
しかし、別のプロセスがファイル (Word など) を開いていることがよくあります。そのため、排他ロックが保持され、アプリで読み取り/書き込み操作ができなくなります。開いたファイルに対してストリーム/チャネルが作成された場合、nio API の FileNotFoundException または FileSystemException が次のようなメッセージとともにスローされます。
ファイルが別のプロセスによって使用されているため、プロセスはファイルにアクセスできません
ファイルが実際にfsに存在しない場合、「実際の」FileNotFoundExceptionをマスクせずにそのようなケースを検出するソリューションを見つけることができませんでした。
File.exists を介して存在を確認し、ストリームを開いたときに FileNotFoundException がスローされた場合、ファイルがロックされていると推測できるというアイデアを思いつきました。私はこれに関するあらゆる意見を受け入れます!
ありがとう!
java - JAVA7ウォッチサービス
アプリケーションの起動時にディレクトリにあるファイルを監視サービスで処理するにはどうすればよいですか?
既にアプリケーションを実行していますが、ディレクトリにドロップされた新しいファイルのみが処理され、最初からそこにあったファイルは無視されることに気付きました。
java - Java 7 WatchService は他の人にとって遅いですか?
WatchService は優れたテクノロジのように見えますが、私がテストした OS X および Linux システムでは遅すぎて役に立ちませんでした。けがに侮辱を加えるために、すべてのイベントが通知されるわけではないようです。
これは、私自身のコードと Oracle の正規の例の両方に当てはまります。( http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/essential/io/examples/WatchDir.java )
OS X OpenJDK ポートがこの機能について不明であることは認識しています ( https://wikis.oracle.com/display/OpenJDK/Mac+OS+X+Port+Project+Statusを参照) 。
これを本番環境で使用して成功した人はいますか?
java-7 - Java 7 の WatchService に関する問題
ファイルシステム上のフォルダーを監視するためにjdk7のWatchService APIを使用しています.ファイルがそのフォルダーに入ると、そのフォルダーに電子メールで新しいファイルを送信し、ENTRY_CRATEオプションをトリガーします。その正常に動作します。しかし、問題は、呼び出している 1 つのイベントではなく、ENTRY_CREATE の 2 つのイベントを生成することです。
以下はコードです:
上記のコードでは、イベントのサイズを 2 にしています。
2 つのイベントが発生する理由を見つけるのを手伝ってください。
java-7 - Java 7 で作成できる newWatchService の数はいくつですか?
newWatchService はいくつ作成できますか?
--> 結果: IOExeption: 開いているファイルが多すぎます...