Memo zur Überwachungsmethode für Verzeichnisänderungen (Java, Kotlin)

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)
        }
    }

}

Punkt

  1. Explizit abgebrochen durch Aufrufen der Abbruchmethode
  2. Implizit abgebrochen, da auf das Objekt nicht mehr zugegriffen werden kann
  3. Abgebrochen durch Schließen des Überwachungsdienstes

Also, dieser Code passiert normalerweise nicht ...

Verbesserungsplan

Impressionen

Schwer zu benutzen ...

Recommended Posts

Memo zur Überwachungsmethode für Verzeichnisänderungen (Java, Kotlin)
Java-Lernnotiz (Methode)
Java Silver Lernmethode Memo
Erstellen Sie eine Java-Methode [Memo] [java11]
[Java] Memo zur Verarbeitungszeitmessmethode
Java-Methode
Java-Memo
Java-Methode
[Java] -Methode
[Java] -Methode
Anmerkung: [Java] Überprüfen Sie den Inhalt des Verzeichnisses
Memo für die Migration von Java nach Kotlin
Java alles Memo
Java Silver Memo
Java, Maven Memo
Java8-Methodenreferenz
Java SE 7 Hinweis
[Java] forEach-Methode
Java alles Memo 2
Java8-Methodenreferenz
Erstellung eines Java-Verzeichnisses
[Java] Zufällige Methode
[Java] Split-Methode
Java-Spezifikationsnotiz
[Java] KFunction von Method / Constructor in Java abrufen [Kotlin]
Java-Muster-Memo
Rufen Sie eine Methode mit Kotlins Rückrufblock von Java aus auf
[Null-Sicherheit] Kotlin Java-Vergleichsnotiz Richtige Verwendung der Null-Sicherheit
JAVA DB-Verbindungsmethode
Memo zur Java-Entwicklungsumgebung
Wechseln Sie die Plätze mit Java
Java Grundwissen Memo
Java Kuche Day Memo
Mac Java-Ausgangsverzeichnis
Informationen zur Bindung von Java-Methoden
Informationen zu Aufteilungsmethoden (Java)
Java 8 studieren (siehe Methode)
[Java, Kotlin] Typabweichung
Java-Programmierung (Klassenmethode)
Java Lambda Ausdruck Memo
(Memo) Java für Anweisung
Java Lambda Ausdruck [Notiz schreiben]
Java-Lernnotiz (Schnittstelle)
[Java] Implizites Vererbungsprotokoll
Java-Lernnotiz (Vererbung)
Programmiernotiz für Java-Wettbewerbe
[Java] Grundlegende Methodenhinweise
[Memo] Java Linked List
[Kotlin] Holen Sie sich Java Constructor / Method von KFunction und rufen Sie es auf