0Pricing
Java Academy · Ders

WatchService: Dosya Değişikliklerini İzleme

Dosya oluşturma, değiştirme ve silme olaylarını gerçek zamanlı olarak algılamak için bir WatchService kaydedin.

WatchService: Dosya Değişikliklerini İzleme, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

WatchService Nedir?

WatchService bir dizini dosya sistemi olayları (oluşturma, değiştirme ve silme) için izler. OS düzeyindeki bildirimleri (Linux'ta inotify, macOS'ta FSEvents) kullanır; bu, yoklamadan çok daha verimlidir.

import java.nio.file.*;

WatchService watcher = FileSystems.getDefault().newWatchService();
Path dir = Path.of("/home/user/watched");

dir.register(watcher,
    StandardWatchEventKinds.ENTRY_CREATE,
    StandardWatchEventKinds.ENTRY_MODIFY,
    StandardWatchEventKinds.ENTRY_DELETE
);
System.out.println("Watching: " + dir);

Olayları Yoklama

Bir olay gerçekleşene kadar engellenmek için watcher.take() çağrısını yapınız, ardından olayları işleyiniz:

while (true) {
    WatchKey key;
    try {
        key = watcher.take(); // blocks until events arrive
    } catch (InterruptedException e) {
        break;
    }
    
    for (WatchEvent<?> event : key.pollEvents()) {
        WatchEvent.Kind<?> kind = event.kind();
        Path changed = ((WatchEvent<Path>) event).context();
        System.out.println(kind.name() + ": " + changed);
    }
    
    key.reset(); // must reset to receive further events
}

Engellemesiz Yoklama

Engellemesiz denetimler için watcher.poll(), zaman sınırlı beklemeler için poll(timeout, unit) kullanınız:

// Non-blocking — returns null if no events
WatchKey key = watcher.poll();
if (key != null) {
    // process events
    key.reset();
}

// Wait up to 5 seconds:
WatchKey key2 = watcher.poll(5, java.util.concurrent.TimeUnit.SECONDS);
if (key2 != null) {
    // process events
    key2.reset();
}

OVERFLOW Olayı

Olaylar uygulamanın onları işleme hızından daha hızlı birikirse, bazı olayların kaybedildiğini bir OVERFLOW olayı bildirir. Bunu düzgün biçimde ele alınız:

for (WatchEvent<?> event : key.pollEvents()) {
    if (event.kind() == StandardWatchEventKinds.OVERFLOW) {
        System.out.println("OVERFLOW: some events missed, rescanning directory");
        // rescan dir to find current state
        continue;
    }
    // process normal events
}

Tam Çalışan Örnek

Arka plan iş parçacığında çalışan eksiksiz bir dosya izleyici:

class FileWatcher implements Runnable {
    private final WatchService watcher;
    
    FileWatcher(Path dir) throws IOException {
        watcher = FileSystems.getDefault().newWatchService();
        dir.register(watcher,
            StandardWatchEventKinds.ENTRY_CREATE,
            StandardWatchEventKinds.ENTRY_MODIFY,
            StandardWatchEventKinds.ENTRY_DELETE);
    }
    
    @Override
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            try {
                WatchKey key = watcher.take();
                for (WatchEvent<?> e : key.pollEvents())
                    System.out.println(e.kind() + ": " + e.context());
                key.reset();
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }
}

Birden Çok Dizini İzleme

Aynı WatchService'e birden çok dizin kaydediniz. Olayın hangi dizinden geldiğini belirlemek için döndürülen WatchKey'i kullanınız:

Map<WatchKey, Path> keyMap = new HashMap<>();

for (Path dir : List.of(Path.of("/logs"), Path.of("/config"))) {
    WatchKey key = dir.register(watcher,
        StandardWatchEventKinds.ENTRY_MODIFY);
    keyMap.put(key, dir);
}

WatchKey key = watcher.take();
Path dir = keyMap.get(key);
System.out.println("Changed in: " + dir);

Tam Yolu Çözümleme

Olayın context() değeri tam yolu değil, yalnızca dosya adını döndürür. Bu adı izlenen dizine göre çözümleyiniz:

WatchEvent<Path> pathEvent = (WatchEvent<Path>) event;
Path filename = pathEvent.context();
Path fullPath = watchedDir.resolve(filename);
System.out.println("Full path: " + fullPath);

Dizinleri Özyinelemeli İzleme

WatchService yalnızca kaydedilen dizini izler, alt dizinlerini izlemez. Özyinelemeli izleme için ağaçta ilerleyip her alt dizini kaydediniz:

WatchService watcher = FileSystems.getDefault().newWatchService();
Path root = Path.of("/project");

try (var stream = Files.walk(root)) {
    stream.filter(Files::isDirectory)
          .forEach(dir -> {
              try { dir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE,
                  StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE);
              } catch (IOException e) { throw new RuntimeException(e); }
          });
}

Kaynakları Temizleme

OS kaynaklarını serbest bırakmak için işiniz bittiğinde WatchService'i her zaman kapatınız:

try (WatchService watcher = FileSystems.getDefault().newWatchService()) {
    Path dir = Path.of("/tmp/watch");
    dir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE);
    
    WatchKey key = watcher.poll(10, java.util.concurrent.TimeUnit.SECONDS);
    if (key != null) {
        key.pollEvents().forEach(e -> System.out.println(e.context()));
        key.reset();
    }
} // watcher.close() called automatically

Pratik Kullanım Örneği: Yapılandırmayı Anında Yenileme

Dosya değiştiğinde yapılandırmayı yeniden yüklemek için WatchService kullanınız:

class ConfigWatcher {
    private volatile Map<String, String> config = new HashMap<>();
    
    void loadConfig(Path file) throws IOException {
        config = Files.readAllLines(file).stream()
            .filter(l -> l.contains("="))
            .collect(Collectors.toMap(
                l -> l.split("=")[0].trim(),
                l -> l.split("=")[1].trim(),
                (a,b) -> b
            ));
    }
    
    // Call loadConfig again on ENTRY_MODIFY event
}

WatchService Sınırlamaları

Önemli sınırlamalar:

  • Tek tek dosyaları değil, yalnızca dizinleri izler
  • Varsayılan olarak özyinelemeli değildir; her alt dizini el ile kaydetmeniz gerekir
  • macOS'ta dahili olarak yoklama kullanır (Linux inotify'ına göre daha az duyarlıdır)
  • Hızlı değişiklik kümelerini kaçırabilir (OVERFLOW)
  • İzlenen dizin silinirse WatchKey geçersiz hâle gelir

Hızlı Kontrol

Bir WatchKey'den gelen olayları işledikten sonra, WatchService'in bu anahtar için başka olaylar gönderebilmesi için ne çağırmanız gerekir?

Özet: WatchService

Temel çıkarımlar:

  • Dizinleri ENTRY_CREATE/MODIFY/DELETE olaylarıyla kaydediniz
  • take() engeller; poll() engellemesizdir; zaman sınırlı bekleme için poll(timeout, unit) kullanılır
  • Olayları işledikten sonra her zaman key.reset() çağrısını yapınız
  • context() yalnızca dosya adını döndürür; tam yol için izlenen dizine göre çözümleyiniz
  • WatchService'i try-with-resources ile kapatınız
  • Özyinelemeli izleme için her alt dizinin kaydedilmesi gerekir

Sıkça Sorulan Sorular

“WatchService: Dosya Değişikliklerini İzleme” dersi ücretsiz mi?

Evet — “WatchService: Dosya Değişikliklerini İzleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“WatchService: Dosya Değişikliklerini İzleme” dersinde ne öğreneceğim?

Dosya oluşturma, değiştirme ve silme olaylarını gerçek zamanlı olarak algılamak için bir WatchService kaydedin. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“WatchService: Dosya Değişikliklerini İzleme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Path: Dosya Konumlarını Temsil Etme
  2. Files Yardımcı Sınıfı: Okuma, Yazma, Kopyalama, Taşıma
  3. Files.walk ile Dizin Ağaçlarında Gezinme
  4. WatchService: Dosya Değişikliklerini İzleme
← Java Academy Sayfasına Dön