我有一个 JavaFX 应用程序,它必须在文件重命名时触发。我是 WatchService 的新手,我已经完成了演示,并且可以正常工作。
虽然,演示是具有 1 类的简单应用程序。现在我想在我自己的应用程序中实现它,创建一个单独的类来处理 WatchService。
主类:
public class KochFractalDraw extends Application {
@Override
public void start(Stage primaryStage) throws IOException, InterruptedException {
//..define GUI etc..
watchdirectory = new WatchDirectory();
Platform.runLater(new Runnable() {
@Override
public void run() {
try {
watchdirectory.Register();
} catch (InterruptedException ex) {
Logger.getLogger(JSF31KochFractalFX.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
使用 WatchDirectory:
public class WatchDirectory {
WatchService watchService;
Path path;
WatchKey key;
public WatchDirectory() throws IOException {
this.watchService = FileSystems.getDefault().newWatchService();
path = Paths.get("D:\\Test");
path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
}
public void Register() throws InterruptedException {
for (;;) {
this.key = watchService.take();
for (WatchEvent<?> event : key.pollEvents()) {
WatchEvent.Kind kind = event.kind();
switch (kind.name()) {
case "ENTRY_CREATE":
System.out.println("Create triggered!");
break;
default:
System.out.println("Wrong event called.");
break;
}
boolean valid = key.reset();
if (!valid) {
break;
}
}
}
}
}
我遇到的问题是它可以工作,但我的 GUI 立即冻结。因此,为什么我把 watchdirectory.Register(); 在 RunLater 中,希望它不会影响主 JavaFX 应用程序线程。
(我知道它可以工作,因为每当我在“D:\Test”中创建/重命名文件时,输出都会继续响应“创建触发!”)