アプリケーションの起動時にディレクトリにあるファイルを監視サービスで処理するにはどうすればよいですか?
既にアプリケーションを実行していますが、ディレクトリにドロップされた新しいファイルのみが処理され、最初からそこにあったファイルは無視されることに気付きました。
アプリケーションの起動時にディレクトリにあるファイルを監視サービスで処理するにはどうすればよいですか?
既にアプリケーションを実行していますが、ディレクトリにドロップされた新しいファイルのみが処理され、最初からそこにあったファイルは無視されることに気付きました。
WatchService は、ファイルシステムの変更のみを処理します。既に存在するファイルは変更されていないため、WatchService によって取得されません。ファイルの最初の「ビュー」を取得するには、すべてのファイルとディレクトリを再帰的にトラバースする必要があります。
Files.walkFileTree(basePath, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file,
BasicFileAttributes attrs) throws IOException {
// do something with the file
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult preVisitDirectory(Path dir,
BasicFileAttributes attrs) throws IOException {
// do something with the directory
return FileVisitResult.CONTINUE;
}
});
初期化後に発生するすべての変更は、WatchService によって取得されます。
私はここで同じユースケースを持っていますが、そのような一般的なシナリオでオンラインであまり役に立たなかったことに驚いています. 以下のアプローチにはいくつかの問題があります。walkTree メソッドを使用してディレクトリ内の既存のファイルをスキャンし、そのディレクトリを WatchService に登録するとします。
1. Files.walkTree(...);
2. Path dir = Paths.get(...);
3. WatchService watcher = dir.getFileSystem().newWatchService();
4. dir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE);
5. // other logic
行 1 が終了した直後から行 5 が開始する前に作成されるファイルはどうでしょうか。議論を容易にするために、これを大まかな境界として使用しているだけです。ファイルが失われる機会の実際の境界は、さらに広い可能性があります。
WatchServiceは、特定の種類の変更とイベントについて、登録済みオブジェクトを監視します。リッスンしているイベントが発生すると、コードが呼び出されます。ファイルの作成、削除、または変更を監視する場合があります。
使用する場合
WatchKey watchKey = path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
... 新しく作成されたファイルのみが報告されます。すでに作成されたファイルを観察するには、次を使用します。
StandardWatchEventKinds.ENTRY_MODIFY