Beachten Sie, wie Sie mit "WatchService" Ordner- und Dateiänderungen in Java überwachen.
OS Window 10
Java
java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)
Hello World
package sample.watch;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Paths;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.nio.file.Watchable;
import static java.nio.file.StandardWatchEventKinds.*;
import static java.nio.file.WatchEvent.*;
public class Main {
public static void main(String[] args) {
WatchService watcher;
try {
watcher = FileSystems.getDefault().newWatchService();
Watchable path = Paths.get("./build");
path.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
} catch (IOException e) {
e.printStackTrace();
return;
}
while (true) {
WatchKey watchKey;
try {
watchKey = watcher.take();
} catch (InterruptedException e) {
System.err.println(e.getMessage());
return;
}
for (WatchEvent<?> event : watchKey.pollEvents()) {
Kind<?> kind = event.kind();
Object context = event.context();
System.out.println("kind=" + kind + ", context=" + context);
}
if (!watchKey.reset()) {
System.out.println("WatchKey ist deaktiviert");
return;
}
}
}
}
** Ausführungsergebnis **

Erläuterung
WatchService watcher;
try {
watcher = FileSystems.getDefault().newWatchService();
...
} catch (IOException e) {
e.printStackTrace();
return;
}
import static java.nio.file.StandardWatchEventKinds.*;
...
Watchable path = Paths.get("./build");
path.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
Path erbt Watchable, sodass es als Überwachungsziel verwendet werden kann. while (true) {
WatchKey watchKey;
try {
watchKey = watcher.take();
} catch (InterruptedException e) {
System.err.println(e.getMessage());
return;
}
...
}
take () -Methode von WatchService ausführen, wartet sie auf die Verarbeitung, bis das zu überwachende Ereignis eintritt.WatchKey ist ein Objekt, das erstellt wird, wenn Sie ein Überwachungsziel mitregister ()of Watchable registrieren. Sie können den Überwachungsstatus steuern, z. B. auf Ereignisinformationen verweisen, die für jedes Überwachungsziel aufgetreten sind, und die Überwachung abbrechen. es kann for (WatchEvent<?> event : watchKey.pollEvents()) {
Kind<?> kind = event.kind();
Object context = event.context();
System.out.println("kind=" + kind + ", context=" + context);
}
WatchEvent) abrufen.WatchEvent
--kind: Art des aufgetretenen Ereignisses
--context: Path-Objekt mit einem relativen Pfad zum erstellten / geänderten / gelöschten Eintrag (Datei oder Ordner)
--count: Häufigkeit, mit der diese Art von Ereignis aufgetreten ist if (!watchKey.reset()) {
System.out.println("WatchKey ist deaktiviert");
return;
}
reset () von WatchKey ausWatchKey.cancel () explizit abgebrochenWatchService.close () hat die Überwachung von WatchService abgebrochen

--WatchService speichert den WatchKey, der beim Ausführen von Watchable.register () erstellt wurde
WatchKey befindet sich unmittelbar nach seiner Erstellung im Status READY, befindet sich also nicht in der Warteschlange.take () blockiert die Verarbeitung, wenn die Warteschlange leer ist, und wartet, bis WatchKey zur Warteschlange hinzugefügt wird
--poll () gibt null zurück, ohne zu blockieren, wenn die Warteschlange leer ist
--Für poll () können Sie die Timeout-Zeit als Argument angeben und bis dahin warten lassen.oder poll ()aus der Warteschlange genommeneWatchKey` wird nicht erneut in die Warteschlange gestellt, wenn er nicht berührt wird.WatchKey ist threadsicher. Selbst wenn während der Ereignisverarbeitung Ereignisinformationen hinzugefügt werden, wird der interne Status nicht beschädigt.
--pollEvents () gibt eine Kopie der Ereignisinformationen zurück, die WatchKey zu diesem Zeitpunkt hatte.pollEvents () erfassten Ereignisinformationen aus dem Inneren von WatchKey gelöscht.
--ZusamenfassendWatchKey gehaltenen Ereignisinformationen leer sind (keine unverarbeiteten Ereignisse), kehrt der Status zu READY zurück.Zusammenfassung,
package sample.watch;
...
public class Main {
public static void main(String[] args) {
...
while (true) {
WatchKey watchKey;
try {
watchKey = watcher.take();
Thread.sleep(1000);★ Ergänzung
} catch (InterruptedException e) {
...
}
...
}
}
}
** Ausführungsergebnis **

Erläuterung
WatchKey gespeicherten Ereignisse begrenzt sein. Wenn ein Ereignis auftritt, das diese Grenze überschreitet, wird das Ereignis OVERFLOW verwendet.pollEvents ()) abrufen, speichern Sie alle Ereignisse einer großen Anzahl von Dateierzeugungen in WatchKey und generieren Sie zwangsweise OVERFLOW. Istpackage sample.watch;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Paths;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.nio.file.Watchable;
import static java.nio.file.StandardWatchEventKinds.*;
import static java.nio.file.WatchEvent.*;
public class Main {
public static void main(String[] args) {
WatchService watcher;
WatchKey fooKey;
WatchKey barKey;
try {
watcher = FileSystems.getDefault().newWatchService();
Watchable foo = Paths.get("./build/foo");
fooKey = foo.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
Watchable bar = Paths.get("./build/bar");
barKey = bar.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
} catch (IOException e) {
e.printStackTrace();
return;
}
while (true) {
WatchKey watchKey;
try {
watchKey = watcher.take();
} catch (InterruptedException e) {
System.err.println(e.getMessage());
return;
}
for (WatchEvent<?> event : watchKey.pollEvents()) {
Kind<?> kind = event.kind();
if (kind == OVERFLOW) {
continue;
}
Object context = event.context();
String directory;
if (watchKey == fooKey) {
directory = "foo";
} else if (watchKey == barKey) {
directory = "bar";
} else {
directory = "unknown";
}
System.out.println("directory=" + directory + ", kind=" + kind + ", context=" + context);
}
if (!watchKey.reset()) {
System.out.println("WatchKey ist deaktiviert");
return;
}
}
}
}
** Ausführungsergebnis **

Erläuterung
Recommended Posts