387. Java IO API - 创建 WatchService 并注册事件

0 阅读3分钟

387. Java IO API - 创建 WatchService 并注册事件

实现文件变化监控的第一步是通过 FileSystem 类的 newWatchService() 方法创建一个新的 WatchService 实例。以下是创建 WatchService 的代码:

WatchService watcher = FileSystems.getDefault().newWatchService();

创建了 WatchService 后,下一步是将一个或多个对象注册到这个监控服务中。任何实现了 Watchable 接口的对象都可以被注册。Path 类实现了 Watchable 接口,因此每个你希望监控的目录都应该作为 Path 对象注册。

注册目录和事件类型

与其他 Watchable 对象类似,Path 接口提供了两个 register 方法。在这里我们使用的是带有两个参数的版本:register(WatchService, WatchEvent.Kind...)。另一个带有三个参数的版本还支持 WatchEvent.Modifier,但目前在 Java 中并未实现,因此我们通常使用两个参数版本。

在注册目录时,你需要指定希望监控的事件类型。以下是 StandardWatchEventKinds 中支持的事件类型:

  • ENTRY_CREATE:表示某个目录项被创建。
  • ENTRY_DELETE:表示某个目录项被删除。
  • ENTRY_MODIFY:表示某个目录项被修改。
  • OVERFLOW:指示可能发生了事件丢失或丢弃。你不需要为这个事件显式注册,它会自动通知你。

示例代码

以下是一个示例代码,展示了如何为指定的目录注册 ENTRY_CREATEENTRY_DELETEENTRY_MODIFY 三种事件类型:

import static java.nio.file.StandardWatchEventKinds.*;

Path dir = ...;  // 指定你要监控的目录
try {
    WatchKey key = dir.register(watcher,
                           ENTRY_CREATE,  // 监控文件创建事件
                           ENTRY_DELETE,  // 监控文件删除事件
                           ENTRY_MODIFY); // 监控文件修改事件
} catch (IOException x) {
    System.err.println(x);
}

代码解析

  1. Path dir = ...;:这里的 dir 是你希望监控的目录,通常是一个 Path 类型的对象,可以使用 Paths.get("目录路径") 来指定。
  2. WatchKey key = dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);:这行代码将目录注册到 watcher(WatchService 实例)上,监控文件的创建、删除和修改事件。
  3. catch (IOException x):如果在注册过程中发生了 I/O 异常(例如,文件系统问题或目录无法访问),将会捕获并打印错误信息。

补充解释

  • WatchService 通过不断轮询监控的目录来监听文件变化。当你注册了目录和感兴趣的事件类型后,WatchService 会在这些事件发生时发出通知。
  • 事件类型(如 ENTRY_CREATEENTRY_DELETEENTRY_MODIFY)可以灵活选择和组合,确保你只接收关心的文件变化事件。
  • OVERFLOW 事件并不会被显式注册,但如果事件队列溢出或丢失了事件,WatchService 会自动触发此事件。在处理时,你可以选择忽略这个事件,或者根据需求进行额外的异常处理。

总结

通过以上步骤,我们可以很容易地使用 WatchService 来注册并监控文件目录的变化。通过合理地选择感兴趣的事件类型,你可以高效地监听文件系统的变化,而不必依赖频繁的轮询方式。