Wie man Javas WatchService benutzt, habe ich mir notiert, weil es unerwartet passte, als ich mit einem leichten Gefühl anfing. Der Code ist Kotlin, aber ist er in Java der gleiche?
class Watcher private constructor(
val path: Path,
val listener: (e: WatchEvent<Path>, target: Path) -> Unit
) : AutoCloseable {
private val executor = Executors.newSingleThreadExecutor()
private val watchService = path.fileSystem.newWatchService()
init {
val watchKey = path.register(watchService, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY)
executor.submit {
while (true) {
val key = watchService.take()
assert(watchKey == key, { "Es ist nur ein Schlüssel registriert, daher sollte er immer übereinstimmen" })
for (e in watchKey.pollEvents()) {
@Suppress("UNCHECKED_CAST") //Immer wenn das WatchKey-Ereignis oben ist, ist es garantiert Path
listener(
e as WatchEvent<Path>,
path.resolve(e.context())
)
}
val valid = watchKey.reset()
if (!valid) throw RuntimeException("Sollte nicht normal passieren")
}
}
}
override fun close() {
executor.shutdownNow()
executor.awaitTermination(1, TimeUnit.SECONDS) //Dieser Wert ist angemessen
watchService.close()
}
companion object {
fun watch(
path: Path,
listener: (e: WatchEvent<Path>, target: Path) -> Unit
): Watcher {
return Watcher(path, listener)
}
}
}
ExecutorService
. Weil WatchService.take ()
blockiert, bis eine Änderung erkannt wird. poll ()
blockiert nicht und gibt null
zurück, aber in jedem Fall ist es bequemer, dies in einem separaten Thread zu tun.WatchKey.pollEvents ()
gibt eine Liste von Wildcarded WatchEvent
s zurück. "WatchEvent.context ()" ist jedoch Dokument und das Ereignis Es wird garantiert immer "Pfad" zurückgegeben, solange einer von "ENTRY_CREATE", "ENTRY_DELETE", "ENTRY_MODIFY" vorhanden ist. Kurz gesagt, es wird immer "Pfad" sein, so dass es kein Problem gibt, es bedingungslos zu wirken.
- Explizit abgebrochen durch Aufrufen der Abbruchmethode
- Implizit abgebrochen, da auf das Objekt nicht mehr zugegriffen werden kann
- Abgebrochen durch Schließen des Überwachungsdienstes
Also, dieser Code passiert normalerweise nicht ...
Schwer zu benutzen ...
Recommended Posts