import java.io.*;
import java.nio.file.*;
public class Tmp {
public static void main(String [] args) throws IOException {
int count = 0;
Path path = Paths.get("C:\\tmp\\");
WatchService ws = null;
try {
ws = FileSystems.getDefault().newWatchService();
path.register(ws, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.OVERFLOW);
} catch (IOException ioe) {
ioe.printStackTrace();
}
while(true) {
WatchKey key = null;
try {
key = ws.take();
} catch(InterruptedException ie) {
ie.printStackTrace();
}
for(WatchEvent<?> event: key.pollEvents()) {
switch(event.kind().name()) {
case "OVERFLOW":
System.out.println(++count + ": OVERFLOW");
break;
case "ENTRY_MODIFY":
System.out.println(++count + ": File " + event.context() + " is changed!");
break;
case "ENTRY_CREATE":
System.out.println(++count + ": File " + event.context() + " is created!");
break;
case "ENTRY_DELETE":
System.out.println(++count + ": File " + event.context() + " is deleted!");
break;
default:
System.out.println(++count + ": UNKNOWN EVENT!");
}
}
key.reset();
}
}
}
Quando ho eseguito questo e poi aperto il Notepad ++ e quindi creato un nuovo file vuoto e salvato come a.txt
nella directory C:\tmp\
ho ottenuto l'output:Perché WatchService genera così tante operazioni?
1: File a.txt is created!
2: File a.txt is deleted!
3: File a.txt is created!
Perché? Sembra che il file sia stato creato e poi cancellato e quindi creato di nuovo. Perché?
Quando ho messo un po 'di testo nel file e salvato l'output era:
4: File a.txt is changed!
5: File a.txt is changed!
Perché cambia due volte?
Penso che il comportamento che stai vedendo con WatchService sia dovuto al modo in cui Notepad ++ e ad alcuni aspetti del funzionamento del sistema operativo Windows quando si eseguono operazioni IO. Ho scoperto che qualcosa come il blocco note "standard" di Windows di solito produce il comportamento più atteso. Ho il sospetto che se si utilizza Process Explorer (http://technet.microsoft.com/en-gb/sysinternals/bb896653.aspx) per monitorare l'attività di I/O a livello di sistema operativo, vedrai gli stessi risultati. –
Ciò potrebbe essere dovuto al fatto che le scritture di contenuto e metadati vengono eseguite separatamente. – afk5min