import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.TreeSet;
import java.util.concurrent.TimeUnit;

import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;

public class PantauDirektori {
    public static void main(String[] args)
            throws IOException, InterruptedException {
        Path dir = Files.createTempDirectory("pantau");
        TreeSet<String> riwayat = new TreeSet<>();

        try (WatchService layanan = FileSystems.getDefault().newWatchService()) {
            WatchKey kunci = dir.register(layanan,
                    ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE);

            // Perubahan dipicu sendiri agar event pasti muncul.
            Path catatan = dir.resolve("catatan.txt");
            Files.writeString(catatan, "baris pertama");
            Files.writeString(catatan, "baris pertama\nditambah");
            Files.delete(catatan);

            WatchKey terima;
            while ((terima = layanan.poll(1, TimeUnit.SECONDS)) != null) {
                for (WatchEvent<?> e : terima.pollEvents()) {
                    riwayat.add(e.kind() + ": " + e.context());
                }
                if (!terima.reset()) {
                    break;
                }
            }
            System.out.println("kunci valid   : " + kunci.isValid());
        }

        for (String p : riwayat) {
            System.out.println("peristiwa     : " + p);
        }
        Files.delete(dir);
    }
}
