问题描述
我有一个Java项目,我们需要继续侦听一些路径以检测是否有任何新的XML文件,如果为true,则需要通过一些其他规则来处理它。
WatchService在发现我是否有要处理的新文件方面做得很好,但是我无法对其进行管理,因此我可以读取该文件,只是将事件的文件名还给我。 / p>
使用WatchService有什么办法吗?如果没有,还有什么建议吗?
谢谢。
解决方法
当然,您可以轻松做到这一点:
-
创建监视服务:
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) {
}
});
}