java中监听文件夹创建删除主要用watchservice api,仅监控注册路径的直接子项,需结合files.isdirectory()判断事件对象是否为目录,递归监听需手动注册新目录并维护注册集合。

Java 中监听文件夹的创建和删除,主要依靠 java.nio.file.WatchService API(JDK 7+),它能监控文件系统事件,包括 ENTRY_CREATE 和 ENTRY_DELETE。但要注意:WatchService 监控的是**当前注册路径下的直接子项**,不递归监听子目录,且对“文件夹”本身没有特殊事件类型——目录创建/删除就表现为普通 ENTRY_CREATE 或 ENTRY_DELETE 事件,需结合 Files.isDirectory() 判断是否为文件夹。
基础监听:注册 WatchService 并识别目录事件
步骤如下:
- 获取
Path对象,调用register()方法注册到WatchService,指定StandardWatchEventKinds.ENTRY_CREATE和StandardWatchEventKinds.ENTRY_DELETE - 使用
watchKey.pollEvents()获取事件,每个事件包含kind()(如 CREATE)、context()(相对路径名)和count() - 将
context()与监听路径拼接成完整路径,再用Files.isDirectory()判断是否为文件夹
示例关键代码:
Path dir = Paths.get("/tmp/watch");
try (WatchService watcher = FileSystems.getDefault().newWatchService()) {
dir.register(watcher,
StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE);
while (true) {
WatchKey key = watcher.take(); // 阻塞等待
for (WatchEvent> event : key.pollEvents()) {
Path child = (Path) event.context();
Path fullPath = dir.resolve(child);
if (Files.isDirectory(fullPath)) {
String kind = event.kind().name();
System.out.println(kind + " directory: " + child);
}
}
if (!key.reset()) break;
}
}
递归监听子目录:需手动注册新增目录
WatchService 默认不自动监听新创建的子目录。若要实现“全树监听”,必须在收到 ENTRY_CREATE 事件后,主动检查该新建项是否为目录,并为其单独注册 WatchService:
- 监听到
ENTRY_CREATE且Files.isDirectory(fullPath)为 true 时,调用fullPath.register(...) - 注意避免重复注册(可维护一个已注册路径集合)
- 删除事件发生时,若对应路径是已注册的监听目录,应从注册集合中移除并显式取消其 WatchKey(虽非强制,但可减少资源占用)
跨平台与局限性须知
WatchService 行为依赖底层操作系统支持:
- Linux(inotify)和 macOS(kqueue)支持较好;Windows(ReadDirectoryChangesW)也基本可用,但某些场景(如网络驱动器、符号链接)可能受限
- 无法可靠捕获“重命名”操作(如
mv a b在 Linux 上可能触发 DELETE + CREATE,也可能只触发 OVERFLOW) - 不保证事件顺序或原子性,高并发下可能丢失事件(建议配合定期扫描做兜底)
- WatchService 实例不是线程安全的,多线程访问 watchKey 需同步
更稳定的替代方案:第三方库(如 Apache Commons IO)
若需开箱即用的递归监听、去抖动、事件合并或更好的异常恢复能力,可考虑:
-
Apache Commons IO 2.11+ 的
FileMonitor(基于轮询,简单稳定,适合小规模) - io.github.lukehutch:fast-classpath-scanner 不适用;推荐 com.github.wendykierp:JTransforms 也不相关 —— 实际常用的是 net.java.dev.jna:jna + 自定义 native hook,或更轻量的 watchservice-wrapper 类库
- 生产环境高频场景建议组合使用:WatchService 做实时通知 + 定时全量比对(如记录 inode/mtime)校验完整性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











