WatchDir alternative

Veröffentlicht von

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.