我有Java程序监视安装在本地服务器上的远程文件夹。 但是,只要远程文件夹中的某些内容发生了变化,它就不会检测到任何更改/修改。
如果在已安装的文件夹中进行更改/修改,则工作正常。
通过网络搜索,如Java文档中所述
如果观看的文件不在本地存储设备上,那么它 如果可以检测到对文件的更改,则是特定于实现的。在 特别是,不需要对文件进行更改 检测远程系统。
任何人都可以帮我提供如何做到这一点的样本?下面是我目前的代码
WatchService watcher = FileSystems.getDefault().newWatchService();
Path dir = Paths.get(directory);
dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
while (true) {
WatchKey key;
try {
key = watcher.take();
} catch (Exception ex) {
return;
}
for (WatchEvent<?> event : key.pollEvents()) {
WatchEvent.Kind<?> kind = event.kind();
@SuppressWarnings("unchecked")
WatchEvent<Path> ev = (WatchEvent<Path>) event;
Path fileName = ev.context();
if (kind == ENTRY_MODIFY) {
System.out.println("file has changed");
// other process
}
if (kind == ENTRY_CREATE) {
System.out.println("file has created");
// other process
}
}
boolean valid = key.reset();
if (!valid) {
break;
}
}
答案 0 :(得分:2)
我猜,Oracle的监视服务不会检测远程事件 - 该服务是针对本地目录的。
您必须使用 - <style class='bar'>
类API -
org.apache.commons.io.monitor.FileAlterationMonitor
你应该谷歌搜索使用该类的代码示例。
答案 1 :(得分:1)
我遇到同样的问题,并使用了org.apache.commons.io.monitor.FileAlterationMonitor
。
pom.xml的更改如之前帖子中所建议的如下所示
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
对我有用的用法的代码段如下:
String monitoringDirectory= "<YOUR CODE HERE>";
FileAlterationObserver observer = new FileAlterationObserver(monitorDirectory);
logger.info("Start ACTIVITY, Monitoring "+monitorDirectory);
observer.addListener(new FileAlterationListenerAdaptor(){
@Override
public void onDirectoryCreate(File file) {
logger.info("New Folder Created:"+file.getName());
}
@Override
public void onDirectoryDelete(File file) {
logger.info("Folder Deleted:"+file.getName());
}
@Override
public void onFileCreate(File file) {
logger.info("File Created:"+file.getName()+": YOUR ACTION");
}
@Override
public void onFileDelete(File file) {
logger.info("File Deleted:"+file.getName()+": NO ACTION");
}
});
/* Set to monitor changes for 500 ms */
FileAlterationMonitor monitor = new FileAlterationMonitor(500, observer);
try {
monitor.start();
} catch (Exception e) {
logger.error("UNABLE TO MONITOR SERVER" + e.getMessage());
e.printStackTrace();
}