mirror of
https://gitee.com/dromara/hutool.git
synced 2025-04-05 17:37:59 +08:00
!1145 新增 文件监听 WatchServer 新增通过 Path 获取 WatchKey 方法
Merge pull request !1145 from 蒋小小/v5-dev
This commit is contained in:
commit
1ceb0e5df6
@ -3,6 +3,7 @@ package cn.hutool.core.io.watch;
|
||||
import cn.hutool.core.io.IoUtil;
|
||||
import cn.hutool.core.lang.Filter;
|
||||
import cn.hutool.core.util.ArrayUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.io.IOException;
|
||||
@ -128,7 +129,7 @@ public class WatchServer extends Thread implements Closeable, Serializable {
|
||||
/**
|
||||
* 执行事件获取并处理
|
||||
*
|
||||
* @param action 监听回调函数,实现此函数接口用于处理WatchEvent事件
|
||||
* @param action 监听回调函数,实现此函数接口用于处理WatchEvent事件
|
||||
* @param watchFilter 监听过滤接口,通过实现此接口过滤掉不需要监听的情况,null表示不过滤
|
||||
* @since 5.4.0
|
||||
*/
|
||||
@ -163,7 +164,7 @@ public class WatchServer extends Thread implements Closeable, Serializable {
|
||||
* @param watchFilter 监听过滤接口,通过实现此接口过滤掉不需要监听的情况,null表示不过滤
|
||||
*/
|
||||
public void watch(Watcher watcher, Filter<WatchEvent<?>> watchFilter) {
|
||||
watch((event, currentPath)->{
|
||||
watch((event, currentPath) -> {
|
||||
final WatchEvent.Kind<?> kind = event.kind();
|
||||
|
||||
if (kind == WatchKind.CREATE.getValue()) {
|
||||
@ -178,6 +179,21 @@ public class WatchServer extends Thread implements Closeable, Serializable {
|
||||
}, watchFilter);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过 path 获取 watchKey
|
||||
*
|
||||
* @param path path
|
||||
* @return 如果不存在则返回 null
|
||||
*/
|
||||
public WatchKey getWatchKey(Path path) {
|
||||
for (Map.Entry<WatchKey, Path> entry : watchKeyPathMap.entrySet()) {
|
||||
if (ObjectUtil.equals(path, entry.getValue())) {
|
||||
return entry.getKey();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 关闭监听
|
||||
*/
|
||||
|
@ -2,53 +2,68 @@ package cn.hutool.core.io;
|
||||
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.WatchEvent;
|
||||
import java.nio.file.WatchKey;
|
||||
import java.nio.file.Watchable;
|
||||
|
||||
import cn.hutool.core.io.watch.SimpleWatcher;
|
||||
import cn.hutool.core.io.watch.WatchMonitor;
|
||||
import cn.hutool.core.io.watch.Watcher;
|
||||
import cn.hutool.core.io.watch.watchers.DelayWatcher;
|
||||
import cn.hutool.core.lang.Console;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* 文件监听单元测试
|
||||
*
|
||||
* @author Looly
|
||||
*
|
||||
* @author Looly
|
||||
*/
|
||||
public class WatchMonitorTest {
|
||||
WatchMonitor monitor;
|
||||
Watcher watcher = new SimpleWatcher() {
|
||||
@Override
|
||||
public void onCreate(WatchEvent<?> event, Path currentPath) {
|
||||
Object obj = event.context();
|
||||
Console.log("创建:{}-> {}", currentPath, obj);
|
||||
WatchKey watchKey = monitor.getWatchKey(currentPath);
|
||||
Path watchable = (Path) watchKey.watchable();
|
||||
Path fullPath = watchable.resolve((Path) event.context());
|
||||
Console.log("Path 完整对象:{}", fullPath);
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
Watcher watcher = new SimpleWatcher(){
|
||||
@Override
|
||||
public void onCreate(WatchEvent<?> event, Path currentPath) {
|
||||
Object obj = event.context();
|
||||
Console.log("创建:{}-> {}", currentPath, obj);
|
||||
}
|
||||
@Override
|
||||
public void onModify(WatchEvent<?> event, Path currentPath) {
|
||||
Object obj = event.context();
|
||||
Console.log("修改:{}-> {}", currentPath, obj);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onModify(WatchEvent<?> event, Path currentPath) {
|
||||
Object obj = event.context();
|
||||
Console.log("修改:{}-> {}", currentPath, obj);
|
||||
}
|
||||
@Override
|
||||
public void onDelete(WatchEvent<?> event, Path currentPath) {
|
||||
Object obj = event.context();
|
||||
Console.log("删除:{}-> {}", currentPath, obj);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDelete(WatchEvent<?> event, Path currentPath) {
|
||||
Object obj = event.context();
|
||||
Console.log("删除:{}-> {}", currentPath, obj);
|
||||
}
|
||||
@Override
|
||||
public void onOverflow(WatchEvent<?> event, Path currentPath) {
|
||||
Object obj = event.context();
|
||||
Console.log("Overflow:{}-> {}", currentPath, obj);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@Test
|
||||
public void testFile() {
|
||||
|
||||
monitor = WatchMonitor.createAll("d:/test/aaa.txt", new DelayWatcher(watcher, 500));
|
||||
|
||||
@Override
|
||||
public void onOverflow(WatchEvent<?> event, Path currentPath) {
|
||||
Object obj = event.context();
|
||||
Console.log("Overflow:{}-> {}", currentPath, obj);
|
||||
}
|
||||
};
|
||||
|
||||
WatchMonitor monitor = WatchMonitor.createAll("d:/test/aaa.txt", new DelayWatcher(watcher, 500));
|
||||
|
||||
monitor.setMaxDepth(0);
|
||||
monitor.start();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Test
|
||||
public void testDir() {
|
||||
monitor = WatchMonitor.createAll("d:/", new DelayWatcher(watcher, 500));
|
||||
|
||||
monitor.run();
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user