Una feature molto utile è quella del WatchService, che consente di registrare una directory e notificare ogni evento che viene compiuto su di essa (es. inserimento nuovi file, cancellazioni file,modifiche eccetera).
Si ottiene questo risultato seguendo la seguente serie di passaggi logici:
Si ottiene questo risultato seguendo la seguente serie di passaggi logici:
- Ottenere un'istanza del WatchService dalla classe FileSystem;
- Registrare la directory di interesse, specificando nei varargs tutti gli eventi per cui si vuole registrarla;
- Effettuare un loop infinito dove si attendono gli eventi. Si utilizza il metodo take() per ottenere l'evento appena disponibile. La chiamata a take() è bloccante, se si vuole invece la versione non bloccante bisogna invocare il poll();
- Una volta ottenuto l'evento di tipo WatchKey si cicla tra tutti gli eventi disponibili per ottenere quello di interesse;
- Una volta processato l'evento si resetta la chiave (key.reset() nel codice), senza questo passaggio soltanto il primo evento nella directory sarà registrato.
package it.test;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
public class ObserveDirChanges {
public static void main(String[] args) {
Path p=Paths.get("c:\\excel");
WatchService ws=null;
try
{
ws=p.getFileSystem().newWatchService();
p.register(ws, StandardWatchEventKinds.ENTRY_CREATE,StandardWatchEventKinds.ENTRY_DELETE,StandardWatchEventKinds.ENTRY_MODIFY,StandardWatchEventKinds.OVERFLOW);
for(;;){
WatchKey key=null;
try
{
key=ws.take();
}
catch(InterruptedException ex){
ex.printStackTrace();
}
for(WatchEvent<?> event:key.pollEvents()){
switch(event.kind().name()){
case "OVERFLOW":
System.out.println("Attenzione è andato perduto un evento");
break;
case "ENTRY_MODIFY":
System.out.println("File "+event.context()+" modificato");
break;
case "ENTRY_CREATE":
System.out.println("File "+event.context()+" creato");
break;
case "ENTRY_DELETE":
System.out.println("File "+event.context()+" cancellato");
break;
}
key.reset();
}
}
}
catch(IOException e){
e.printStackTrace();
}
}
}
Nessun commento:
Posta un commento