【工具】JAVA监听本地目录以及遇到的问题及解决方案
监听目录
依赖
<!--hutool具包-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.4.M1</version>
</dependency>
代码 直接执行main方法即可监听
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.file.FileReader;
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 cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.WatchEvent;
@Slf4j
public class NewsDirectoryListener {
private static final String 监听目录 = "C:\\workspace\\file";
private static final Long 监听延迟毫秒 = 0l;
private static WatchMonitor watchMonitor = null;
public static void main(String[] args) {
NewsDirectoryListener.监听目录();
// NewsDirectoryListener.监听文件夹全部事件();
}
public static void 监听目录(){
Watcher watcher = new Watcher() {
@Override
public void onCreate(WatchEvent<?> event, Path currentPath) {
Object obj = event.context();
Console.log("创建:{}-> {}", currentPath, obj);
String 文件全称 = obj.toString();
String 文件路径 = StrUtil.format("{}//{}", currentPath, 文件全称);
NewsDirectoryListener.处理文件(文件路径);
}
@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 onOverflow(WatchEvent<?> event, Path currentPath) {
Object obj = event.context();
Console.log("Overflow:{}-> {}", currentPath, obj);
}
};
//这里只监听文件或目录的修改事件
watchMonitor = WatchMonitor.create(NewsDirectoryListener.监听目录,
WatchMonitor.ENTRY_CREATE);
// new DelayWatcher(watcher, NewsDirectoryListener.监听延迟毫秒));
watchMonitor.setWatcher(watcher);
//设置监听目录的最大深入,目录层级大于制定层级的变更将不被监听,默认只监听当前层级目录
watchMonitor.setMaxDepth(3);
//启动监听
watchMonitor.start();
}
public static void 监听文件夹全部事件(){
WatchMonitor.createAll(NewsDirectoryListener.监听目录, new SimpleWatcher(){
@Override
public void onModify(WatchEvent<?> event, Path currentPath) {
Object obj = event.context();
Console.log("EVENT modify --> {}\\{}", currentPath, obj);
}
}).setMaxDepth(3).start();
}
public static boolean 处理文件(String 文件路径){
boolean 是否文件 = FileUtil.isFile(文件路径);
if(!是否文件){
try {
//重新注册这个新目录
watchMonitor.registerPath(Paths.get(文件路径), 3);
}catch (Exception e){
e.printStackTrace();
}
return false;
}
//默认UTF-8编码,可以在构造中传入第二个参数做为编码
FileReader fileReader = new FileReader(文件路径);
String result = fileReader.readString();
log.info(fileReader.getFile().getPath());
if(StrUtil.isBlank(result)){
return false;
}
// log.info(result);
//调用接口 将信息传过去
return true;
}
}
问题:
在目录里新建文件夹后监听不到新文件夹的问题
监听不到新文件夹
解决方案,注册这个新目录到监听
if(!是否文件){
try {
//重新注册这个新目录
watchMonitor.registerPath(Paths.get(文件夹路径), 3);
}catch (Exception e){
e.printStackTrace();
}
return false;
}
参考文档