問題タブ [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 を使用して外部プログラムからログ ファイルを監視するアプリケーションを作成しています ( http://docs.oracle.com/javase/7/docs/api/java/nio/file/WatchService.html)。ファイルで EVENT_MODIFIED がトリガーされるたびに、ファイルを読み取り、特定の文字列が存在するかどうかを確認します。手動でテキストを入力してファイルを保存すると、プログラムは正常に動作しますが、ログ ファイルが外部プログラムによって編集されると、WatchService がトリガーされません。
ファイルを読み取り、一定時間スリープしてから繰り返すスレッドを使用する別のアプローチを試しました。これでうまくいきますが、変更を「リッスン」するだけでよい場合は、X 秒ごとにファイルをポーリングしたくありません。
WatchServices がこれらの変更を検出しない理由を知っている人はいますか?
java - WatchService では、key.pollEvents() と key.reset() の間で何が起こりますか?
このJava の例を見ると、キーの状態について、オラクルは次のように述べています。
Readyは、キーがイベントを受け入れる準備ができていることを示します。最初に作成されたとき、キーは準備完了状態にあります。
Signaledは、1 つ以上のイベントがキューに入れられていることを示します。キーが通知されると、reset メソッドが呼び出されるまで、キーは準備完了状態ではなくなります。
WatchKey
javadocで:
キーがシグナル状態にある間に検出されたイベントはキューに入れられますが、監視サービスから取得するためにキーが再度キューに入れられることはありません
key.pollEvents()
ドキュメントには、 と の間で生成されたイベントがどうなるかは記載されていませんkey.reset()
。キーがリセットされるまでイベントはバッファリングされ、キーはリセット直後に通知されると想定されています。これは、以下のテストでサポートされているようです。
公式ドキュメントを教えていただけますか?またはドキュメントの欠如についての議論に?
... によって許可された 20 代以内にsleep()
、私は次のことを行いました。
- ファイルを作成し、
- 編集して、保存して、
- 名前を変更し、
- 編集して、保存して、
- 消して
出力:
わかりました。
java - WatchService は CentOS で CPU を 100% 使用します
アプリケーションでを使用しWatchService
ています。Windows
アプリケーションを環境で実行すると、アプリケーションはCPU
. 私のLinux
サーバーで同じアプリケーションを実行すると、CPU
. WatchService
スレッドが無効になると、はCPU
正常に戻ります。
で使用CentOS 5.9
していOpenJDK-1.7.0_x86_64
ます。
スレッドは次のとおりです。
の100%を使用しているのはなぜCPU
ですか?
java - Javaを使用してハードドライブ/ファイルシステム全体にインデックスを付ける方法は?
Java を使用して、ハード ドライブ全体のファイルの変更を取得したいと考えています。例 c:\ または /mnt/drives/hdd1
多くの異なるコンピューターが異なるファイル構造で使用され、他のソフトウェアに影響を与えずに簡単に変更できないため、これは要件です。ただし、特定のファイルとファイルタイプはインデックス化する必要があります。ドライブ c:\ d:\ e:\ および任意のサブフォルダーに存在できます。
すべてのサブディレクトリを手動で追加する必要があるため、Java WatchService はその役割を果たしません。実行不可能で遅い 10+k を超えるフォルダーがあります。
私はJAVAでこのようなものを探しています:
C# と Java の実装の違い: WatchService Java コードを管理者権限で実行した場合、c:\$Recycle.Bin にはアクセスできますが、c:\Documents and Settings にはアクセスできません。アクセス拒否例外が発生します。誰かが理由を教えてもらえますか? そして、私が述べたように、すべてのサブディレクトリがクロールされるまで多くの時間がかかるため、WatchService は解決策ではありません。フォルダ。
JAVA 実装:
java - 続行する前に、フォルダ ツリーが完全であることを確認してください
指定したアップロード フォルダーにドラッグされたファイルとフォルダーがクラウド サービスにアップロードされる、ホットフォルダー タイプのプログラムを作成しています。
これを行う方法の簡単な概要:
- WatchService は、何かがフォルダーにドラッグされたことを通知します。
- Files.walkFileTree はドラッグされたフォルダーを介して、クラウド サービスにフォルダーを作成し、ドラッグされたフォルダー構造をエミュレートします。
- 遭遇したファイルをそれぞれのフォルダーにアップロードします。
私の問題は、ネストされたディレクトリ ツリーが監視フォルダーに完全にコピーされていることを確認するための最も堅牢な方法を見つけるのに苦労していることです。walkFileTree メソッドは、呼び出し直後にディレクトリ ツリーを「スナップショット」するため、呼び出し後に作成されたフォルダーを検出できません。変更を検出するために使用している関数そのものが、呼び出された後に発生する変更を認識しないため、これは問題を引き起こします。
これに対処するために、ウォークの前に Thread.sleep(3000) を追加しましたが、これは恣意的で、失敗することがあります。この獣を飼いならす方法についてのアイデアはありますか?
呼び出し時にツリー構造を設定しないリアルタイム ファイル ツリー ウォーカーはありますか? カスタム関数を作成する運命にあるのでしょうか? (冗談、それは楽しそうですね。)
java - WatchService が JavaFX GUI をフリーズさせる
ファイルの名前が変更されるたびにトリガーする必要があるJavaFXアプリケーションがあります。私は WatchService が初めてで、デモを行って動作します。
ただし、デモは 1 クラスの単純なアプリケーションです。今度は、WatchService を処理する別のクラスを作成して、自分のアプリケーションに実装したいと考えています。
メインクラス:
WatchDirectory の場合:
私が抱えている問題は、それが機能することですが、GUI がすぐにフリーズします。したがって、watchdirectory.Register(); を入れた理由 メインのJavaFXアプリケーションスレッドに影響を与えないことを期待して、RunLaterで。
(「D:\Test」でファイルを作成/名前変更するたびに、出力が「作成がトリガーされました!」と応答し続けるため、機能することはわかっています)