问题
I have Java program monitoring a remote folder mounted in my local server. But it is not detecting any changes / modification whenever something changed in the remote folder.
It is working fine if the changes / modification is made in the mounted folder.
Searching through net, as mention in the Java docs
If a watched file is not located on a local storage device then it is implementation specific if changes to the file can be detected. In particular, it is not required that changes to files carried out on remote systems be detected.
Anyone could help provide me sample on how to do this? below is my current code
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;
}
}
回答1:
I guess, Oracle's watch service doesn't detect remote events - that service is for local directories.
You have to use - org.apache.commons.io.monitor.FileAlterationMonitor
class of API -
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
You should google for code samples using that class.
回答2:
I have same issue and used org.apache.commons.io.monitor.FileAlterationMonitor
.
The pom.xml changes as suggested in the post before is as below
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
Code Snippet for usage which is working for me is as below:
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();
}
来源:https://stackoverflow.com/questions/48919086/java-watch-service-not-working-for-remote-files-mounted-in-the-local-server