新しい XML ファイルがあるかどうかを検出するためにパスをリッスンし続ける必要がある Java プロジェクトがあります。新しい XML ファイルがある場合は、他のいくつかのルールに従って処理する必要があります。
WatchService は、処理すべき新しいファイルがあるかどうかをうまく検出していますが、ファイルを読み取ることができるように管理できませんでした。イベントからファイル名を返すだけです。
WatchService を使用してそれを行う方法はありますか?そうでない場合、別の提案は何ですか?
ありがとうございます。
ファイル名がわかっている場合は、ファイルを開けばいいだけです。ル?
– マークスペース
2020 年 9 月 3 日 21:36
4
「ファイル名だけ」の場合WatchEvent#context() の結果を意味しているので、それをディレクトリに対して解決してフルパスを取得するだけです。
– スロー
2020 年 9 月 3 日 22:40
------------------------
もちろん、それは簡単にできます。
監視サービスを作成します。
WatchService watchService = null;
try {
watchService = FileSystems.getDefault().newWatchService();
Path path = get(pathToSee);
path.register(watchService, new WatchEvent.Kind[]{ENTRY_MODIFY, ENTRY_CREATE}, SensitivityWatchEventModifier.HIGH);
watchEvent(watchService, path);
log.info("Watch Service has ben created!");
} catch (IOException e) {
log.error("Exception has ben throw when the service have tried to createWatchService()", e);
}
注: 追加するファイルが大量にある場合は、次のように入力できます:
SensitivityWatchEventModifier.HIGH
感度を高めるため。
ディレクトリに変更があるかどうかを監視します:
WatchKey key;
while (true) {
try {
if ((key = watchService.take()) == null) break;
for (WatchEvent<?> event : key.pollEvents()) {
log.info("Event kind:" + event.kind()
+ ". File affected: " + event.context() + ".");
String fileName = event.context().toString();
File directory = path.toFile();
yourService.readContent(directory, fileName);
}
key.reset();
} catch (InterruptedException | IOException e) {
log.error("InterruptedException when try watchEvent()" + e);
}
}
そして最後に、その情報を使ってやりたいことを行うことができます。
try (BufferedReader br = new BufferedReader(new FileReader(directory + "/" + fileName))) {
String strLine;
while ((strLine = br.readLine()) != null) {
}
}
}
}
ヒント:
これを行うために別個のスレッドを作成することも、Spring @Async を使用して別個のスレッドを作成してこの情報を処理し、アプリケーションの同時実行性を高めることもできます。
Apache Commons を使用してそれを行うこともできます。
例:
public void getAll() throws Exception {
FileAlterationObserver observer = new FileAlterationObserver(pathToSee);
observer.addListener(new FileAlterationListenerAdaptor() {
@SneakyThrows
@Override
public void onFileCreate(File file) {
}
@Override
public void onFileDelete(File file) {
}
});
}