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 genommene
WatchKey` 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