当我们需要实时监控指文件的创建、修改、删除,以及目录下文件的创建、修改和删除,在JDK7前我们只能靠轮询方式遍历目录或者定时检查文件的修改事件,这样效率非常低,性能也很差。因此在JDK7中引入了WatchService。不过考虑到其API并不友好,于是Hutool便针对其做了简化封装,使监听更简单,也提供了更好的功能
Hutool:官网 WatchMonitor方法 API文档
Maven导入:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.9</version>
</dependency>
代码:
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.watch.WatchMonitor;
import cn.hutool.core.io.watch.Watcher;
import cn.hutool.core.io.watch.watchers.DelayWatcher;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.nio.file.Path;
import java.nio.file.WatchEvent;
@Component
@Slf4j
public class TestController {
@Value("${dvp.path.asset2d}")
private String assetPath;
@PostConstruct
private void watchMonitorFile(){
//这里监听文件或目录的修改删除新增及丢失事件
WatchMonitor watchMonitor = WatchMonitor
.createAll(FileUtil.file(assetPath), new DelayWatcher(new Watcher() {
@Override
public void onCreate(WatchEvent<?> event, Path currentPath) {
Object obj = event.context();
log.info("2D创建:{}-> {}", currentPath, JSON.toJSONString(obj));
}
@Override
public void onModify(WatchEvent<?> event, Path currentPath) {
Object obj = event.context();
log.info("2D修改:getFileName{} {}-> {}",currentPath.getFileName(), currentPath, JSON.toJSONString(obj));
}
@Override
public void onDelete(WatchEvent<?> event, Path currentPath) {
Object obj = event.context();
log.info("2D删除:{}-> {}", currentPath, JSON.toJSONString(obj));
}
@Override
public void onOverflow(WatchEvent<?> event, Path currentPath) {
Object obj = event.context();
log.info("2DOverflow:{}-> {}", currentPath, JSON.toJSONString(obj));
}
}, 500));
//设置监听目录的最大深入,目录层级大于制定层级的变更将不被监听,默认只监听当前层级目录
watchMonitor.setMaxDepth(4);
//启动监听
watchMonitor.start();
}
}
当涉及到二层文件夹目录的时候,需要主要把目录放入到文件监听进去