Da die Klasse „java.nio.file.WatchService“ leider nicht so recht funktioniert, wenn man ein Ordner auf einem Netzlaufwerk überwachen und 2 Programme auf verschiedenen Rechnern laufen lassen will, habe ich nach einer Alternative gesucht.
Problembeschreibung: der WatchService hatte die Daten blockiert, so das der zweite Rechner Probleme hatte, die Daten zu löschen.
Alternative:
Ich habe im Netz ein example gefunden, was wunderbar funktioniert (wurde mit der Lib „commons-io“ von Apache umgesetzt).
FileMonitorDemo.java
import java.io.File;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
/**
* @author ashraf
*
*/
public class FileMonitorDemo {
// Get the user home directory to be monitored
private static final String FOLDER = System.getProperty("user.home");
// The monitor will perform polling on the folder every 30 seconds
private static final long pollingInterval = 30 * 1000;
/**
* @param args
*/
public static void main(String[] args) throws Exception {
// Change this to match the environment you want to watch.
final File directory = new File(FOLDER);
// Create a new FileAlterationObserver on the given directory
FileAlterationObserver fao = new FileAlterationObserver(directory);
// Create a new FileAlterationListenerImpl and pass it the previously created FileAlterationObserver
fao.addListener(new FileAlterationListenerImpl());
// Create a new FileAlterationMonitor with the given pollingInterval period
final FileAlterationMonitor monitor = new FileAlterationMonitor(
pollingInterval);
// Add the previously created FileAlterationObserver to FileAlterationMonitor
monitor.addObserver(fao);
// Start the FileAlterationMonitor
monitor.start();
System.out.println("Starting monitor (" + FOLDER
+ "). \"Press CTRL+C to stop\"");
}
}
FileAlterationListenerImpl.java
import java.io.File;
import java.util.Date;
import org.apache.commons.io.monitor.FileAlterationListener;
import org.apache.commons.io.monitor.FileAlterationObserver;
/**
* @author eddie
* @source http://examples.javacodegeeks.com/core-java/apache/commons/io-commons/monitor/filealterationmonitor/org-apache-commons-io-monitor-filealterationmonitor-example/
*
*/
public class FileAlterationListenerImpl implements FileAlterationListener {
@Override
public void onStart(final FileAlterationObserver observer) {
System.out.println("The FileListener has started on "
+ observer.getDirectory().getAbsolutePath());
}
@Override
public void onDirectoryCreate(final File directory) {
System.out.println(directory.getAbsolutePath() + " was created.");
}
@Override
public void onDirectoryChange(final File directory) {
System.out.println(directory.getAbsolutePath() + " wa modified");
}
@Override
public void onDirectoryDelete(final File directory) {
System.out.println(directory.getAbsolutePath() + " was deleted.");
}
@Override
public void onFileCreate(final File file) {
System.out.println(file.getAbsoluteFile() + " was created.");
System.out.println("1. length: " + file.length());
System.out
.println("2. last modified: " + new Date(file.lastModified()));
System.out.println("3. readable: " + file.canRead());
System.out.println("4. writable: " + file.canWrite());
System.out.println("5. executable: " + file.canExecute());
}
@Override
public void onFileChange(final File file) {
System.out.println(file.getAbsoluteFile() + " was modified.");
System.out.println("1. length: " + file.length());
System.out
.println("2. last modified: " + new Date(file.lastModified()));
System.out.println("3. readable: " + file.canRead());
System.out.println("4. writable: " + file.canWrite());
System.out.println("5. executable: " + file.canExecute());
}
@Override
public void onFileDelete(final File file) {
System.out.println(file.getAbsoluteFile() + " was deleted.");
}
@Override
public void onStop(final FileAlterationObserver observer) {
System.out.println("The FileListener has stopped on "
+ observer.getDirectory().getAbsolutePath());
}
}
Hier gehts zum example, mit der Erklärung.