Come monitorare una cartella per le modifiche in java?

Ho il seguente codice per monitorare una cartella per eventuali modifiche in java:

public class FolderWatcher { // public List events = new ArrayList(); public static Event call() throws IOException, InterruptedException { LOG.info("Watching folder"); Path _directotyToWatch = Paths.get("data/input-files"); // this will be put in the configuration file WatchService watcherSvc = FileSystems.getDefault().newWatchService(); WatchKey watchKey = _directotyToWatch.register(watcherSvc, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); watchKey = watcherSvc.take(); for (WatchEvent event : watchKey.pollEvents()) { WatchEvent watchEvent = castEvent(event); LOG.info(event.kind().name().toString() + " " + _directotyToWatch.resolve(watchEvent.context())); String eventName = event.kind().name(); String fileName = _directotyToWatch.resolve(watchEvent.context()).toString(); watchKey.reset(); return new Event(eventName, fileName); } return null; } @SuppressWarnings("unchecked") static  WatchEvent castEvent(WatchEvent event) { return (WatchEvent) event; } } 

e:

 public abstract class AbstractWatcher { abstract void eventDetected(Event event); private final ScheduledExecutorService threadpool; public AbstractWatcher(ScheduledExecutorService threadpool) { this.threadpool = threadpool; } public AbstractWatcher() { threadpool = Executors.newSingleThreadScheduledExecutor(); } public void handle() { final FolderWatcherHandler handler = new FolderWatcherHandler(); final Runnable r = new Runnable() { @Override public void run() { try { Event event = FolderWatcher.call(); if (event != null) { handler.eventDetected(event); } } catch (IOException e) { LOG.error("failed to watch the update", e); } catch (InterruptedException e) { LOG.info("thread interrupted", e); Thread.currentThread().interrupt(); return; } } }; Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { threadpool.shutdown(); } }); threadpool.scheduleWithFixedDelay(r, 0, 1, TimeUnit.NANOSECONDS); } } 

e:

 public class FolderWatcherHandler extends AbstractWatcher { @Override public void eventDetected(Event event) { // Do stuff } } 

Tutto questo funziona perfettamente a patto che le modifiche dei file (nel mio caso per lo più l’aggiunta) vengano eseguite 1 per 1 con un piccolo ritardo all’interno di ciascuna aggiunta. Tuttavia, se trascino e rilascia o aggiungo più file contemporaneamente. Questo codice rileva solo l’evento per il primo file e non il resto. Ho persino inserito il tempo di esecuzione in nanosecondi ma non è stato d’aiuto. Mi chiedo se questo intero codice sia un modo per farlo. Qualcuno può aiutarmi. Grazie.

Perché non si memorizza un file di metadata in ogni cartella (in recursively ), in quel file di metadata è ansible memorizzare l’ file list e modified date e la size di ciascun file. Il tuo thread dovrebbe confrontare questo file di metadata in ogni cartella con i current files presenti nello stesso. È così che puoi rilevare qualsiasi cambiamento all’interno di quella cartella.

Ricorda che dovresti farlo in modo ricorsivo per ogni subfolder interno. E il file dei metadata dovrebbe essere aggiornato con ogni scansione. Spero che questo ti aiuti..