Java NIO 监视服务
Java NIO WatchService
我有一个 Java 项目,我们需要继续监听一些路径以检测是否有任何新的 XML 文件,如果是,我们需要通过其他一些规则来处理它。
WatchService 在发现我是否有要处理的新文件方面做得很好,但我无法管理它以便我可以读取文件,我只是从事件中返回文件名.
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) {
}
});
}
我有一个 Java 项目,我们需要继续监听一些路径以检测是否有任何新的 XML 文件,如果是,我们需要通过其他一些规则来处理它。
WatchService 在发现我是否有要处理的新文件方面做得很好,但我无法管理它以便我可以读取文件,我只是从事件中返回文件名.
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) {
}
});
}