From 5d99de9b89e91d4960a18aee84648aedd771d4dd Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 5 Oct 2019 21:24:57 +0800 Subject: [PATCH] fix watchService --- .../cn/hutool/core/io/watch/WatchMonitor.java | 70 ++++++++++++------- .../cn/hutool/core/io/watch/WatchUtil.java | 23 +++++- 2 files changed, 63 insertions(+), 30 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchMonitor.java b/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchMonitor.java index c5992d3d5..708a9f1bd 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchMonitor.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchMonitor.java @@ -1,30 +1,5 @@ package cn.hutool.core.io.watch; -import java.io.Closeable; -import java.io.File; -import java.io.IOException; -import java.io.Serializable; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.nio.file.AccessDeniedException; -import java.nio.file.ClosedWatchServiceException; -import java.nio.file.FileSystems; -import java.nio.file.FileVisitOption; -import java.nio.file.FileVisitResult; -import java.nio.file.Files; -import java.nio.file.LinkOption; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.SimpleFileVisitor; -import java.nio.file.StandardWatchEventKinds; -import java.nio.file.WatchEvent; -import java.nio.file.WatchKey; -import java.nio.file.WatchService; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.Map; - import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IoUtil; @@ -33,6 +8,18 @@ import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.URLUtil; +import java.io.Closeable; +import java.io.File; +import java.io.IOException; +import java.io.Serializable; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.*; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Map; + /** * 路径监听器 * @@ -97,6 +84,10 @@ public class WatchMonitor extends Thread implements Closeable, Serializable { * 监听事件列表 */ private WatchEvent.Kind[] events; + /** + * 监听选项,例如监听频率等 + */ + private WatchEvent.Modifier[] modifiers; /** * 监听是否已经关闭 @@ -450,6 +441,22 @@ public class WatchMonitor extends Thread implements Closeable, Serializable { return this; } + /** + * 设置监听选项,例如监听频率等,可设置项包括:

+ * + *

+	 * 1、com.sun.nio.file.StandardWatchEventKinds
+	 * 2、com.sun.nio.file.SensitivityWatchEventModifier
+	 * 
+ * + * @param modifiers 监听选项,例如监听频率等 + * @return this + */ + public WatchMonitor setModifiers(WatchEvent.Modifier[] modifiers) { + this.modifiers = modifiers; + return this; + } + /** * 关闭监听 */ @@ -466,7 +473,7 @@ public class WatchMonitor extends Thread implements Closeable, Serializable { * * @param watcher {@link Watcher} */ - private void doTakeAndWatch(Watcher watcher){ + private void doTakeAndWatch(Watcher watcher) { WatchKey wk; try { wk = watchService.take(); @@ -513,9 +520,18 @@ public class WatchMonitor extends Thread implements Closeable, Serializable { * @param maxDepth 递归下层目录的最大深度 */ private void registerPath(Path path, int maxDepth) { + final WatchEvent.Kind[] kinds = ArrayUtil.defaultIfEmpty(this.events, EVENTS_ALL); + try { - final WatchKey key = path.register(this.watchService, ArrayUtil.defaultIfEmpty(this.events, EVENTS_ALL)); + final WatchKey key; + if (ArrayUtil.isEmpty(this.modifiers)) { + key = path.register(this.watchService, kinds); + } else { + key = path.register(this.watchService, kinds, this.modifiers); + } watchKeyPathMap.put(key, path); + + // 递归注册下一层层级的目录 if (maxDepth > 1) { //遍历所有子目录并加入监听 Files.walkFileTree(path, EnumSet.noneOf(FileVisitOption.class), maxDepth, new SimpleFileVisitor() { diff --git a/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchUtil.java index eb38fb6a5..97c9c2b4b 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchUtil.java @@ -1,12 +1,12 @@ package cn.hutool.core.io.watch; import java.io.File; +import java.io.IOException; import java.net.URI; import java.net.URL; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.WatchEvent; +import java.nio.file.*; +import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.util.URLUtil; /** @@ -377,4 +377,21 @@ public class WatchUtil { watchMonitor.setWatcher(watcher); return watchMonitor; } + + /** + * 注册Watchable对象到WatchService服务 + * + * @param watchable 可注册对象 + * @param watcher WatchService对象 + * @param events 监听事件 + * @return {@link WatchKey} + * @since 4.6.9 + */ + public static WatchKey register(Watchable watchable, WatchService watcher, WatchEvent.Kind... events){ + try { + return watchable.register(watcher, events); + } catch (IOException e) { + throw new IORuntimeException(e); + } + } }