Giriş
Şu satırı dahil ederiz.
Kullanım
1. FileSystem sınıfının newWatchService() metodunu kullanarak bir WatchService yaratılır.
Dosya yaratılmayı yakalamak için StandardWatchEventKinds.ENTRY_CREATE kullanılır. Şöyle yaparız.
poll metodu
Belirtilen süre kadar WatchKey nesnesinin gelmesini bekler.
take metodu
WatchKey nesnesi hazır oluncaya kadar bloke olur.
Örnek
Şöyle yaparız.
Açıklaması şöyle.
Bazı kodlarda null kontrolü yapılıyor. Buna gerek yok.
Şu satırı dahil ederiz.
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
Bu sınıf yerine eskiden Apache Commons'tan VFS API kullanılırdı.
Kullanım
1. FileSystem sınıfının newWatchService() metodunu kullanarak bir WatchService yaratılır.
2. Daha sonra Path.register() metodu ile izlemek istediğimiz dizini ve olayları belirtiriz.
2.1 Dosya yaratılmayı yakalamak için StandardWatchEventKinds.ENTRY_CREATE kullanılır. Dosyanın yaratılmış olması diğer uygulamanın yazmayı bitirdiği anlamına gelmez.
2.2 Dosyanın değiştirildiğimi yakalamak için StandardWatchEventKinds.ENTRY_MODIFY kullanılır. Belli bir süre değiştirilmeyen dosyaya diğer uygulamanın yazmayı bitirdiği varsayabilir.
3. WatchService.take() veya WatchService.poll() ile sonsuz bir döngü kurarak dizini izlemeye başlarız.
2.1 Dosya yaratılmayı yakalamak için StandardWatchEventKinds.ENTRY_CREATE kullanılır. Dosyanın yaratılmış olması diğer uygulamanın yazmayı bitirdiği anlamına gelmez.
2.2 Dosyanın değiştirildiğimi yakalamak için StandardWatchEventKinds.ENTRY_MODIFY kullanılır. Belli bir süre değiştirilmeyen dosyaya diğer uygulamanın yazmayı bitirdiği varsayabilir.
3. WatchService.take() veya WatchService.poll() ile sonsuz bir döngü kurarak dizini izlemeye başlarız.
Sonsuz döngü bir ExecutorService ile de kurulabilir.
Kullanılan Thread
WatchService tek bir thread kullanır. Bu thread'in ismi şöyle
WatchService tek bir thread kullanır. Bu thread'in ismi şöyle
Thread[FileSystemWatcher]
constructorÖrnek
Şöyle yaparız.WatchService watchService = FileSystems.getDefault().newWatchService();
register metodu
ÖrnekDosya yaratılmayı yakalamak için StandardWatchEventKinds.ENTRY_CREATE kullanılır. Şöyle yaparız.
Path faxFolder = Paths.get("./faxFolder/");
WatchService watchService = ...;
faxFolder.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
Örnek
Şöyle yaparız. Burada bir dizin gözlemleniyor.
import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;
WatchService watcher = FileSystems.getDefault().newWatchService();
Path path = ...;
WatchKey watchKes = path.register(watcher,
ENTRY_CREATE,
ENTRY_DELETE,
ENTRY_MODIFY);
Belirtilen süre kadar WatchKey nesnesinin gelmesini bekler.
take metodu
WatchKey nesnesi hazır oluncaya kadar bloke olur.
Örnek
Şöyle yaparız.
WatchKey watckKey = watcher.take();
ÖrnekAçıklaması şöyle.
When an event occurs, the key is signaled and placed into the watcher's queue. After processing its events, we need to put it back into a ready state by invoking its reset() method. If it returns false, the key is no longer valid and the loop can exit.Şöyle yaparız.
WatchService watchService = FileSystems.getDefault().newWatchService();
Path path = Paths.get("c:\\directory");
path.register(watchService, ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE);
boolean poll = true;
while (poll) {
WatchKey key = watchService.take();
for (WatchEvent<?> event : key.pollEvents()) {
System.out.println("Event kind : " + event.kind() + " - File : " + event.context());
}
poll = key.reset();
}
ÖrnekBazı kodlarda null kontrolü yapılıyor. Buna gerek yok.
WatchService watchService = FileSystems.getDefault().newWatchService();
Path path = Paths.get(dirLocation);
path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_MODIFY,
StandardWatchEventKinds.ENTRY_DELETE);
WatchKey key;
while ((key = watchService.take()) != null) {
for (WatchEvent<?> event : key.pollEvents()) {
if ("ENTRY_CREATE".equalsIgnoreCase(event.kind().name())) {
// File reading here
}
}
}