java实现监控文件变化
前言
监控文件的创建,修改和删除
实现
使用java内置的WatchService
复制import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchEvent.Kind;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.concurrent.TimeUnit;
public class WatchServiceTest {
public static void main(String[] args) throws IOException, InterruptedException {
WatchService service = FileSystems.getDefault().newWatchService();
Path path = Paths.get("D:\\java\\decompile").toAbsolutePath();
path.register(service,
StandardWatchEventKinds.ENTRY_MODIFY,
StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE);
while (true) {
WatchKey key = service.poll(3, TimeUnit.SECONDS);
if (key == null) {
continue;
}
for (WatchEvent<?> event : key.pollEvents()) {
Kind<?> kind = event.kind();
Path context = (Path) event.context();
System.out.printf("Event %s has happened,which fileName is %s%n", kind.name(), context);
}
key.reset();
}
}
}
监控decompile文件夹,当文件夹内有新文件创建,文件修改或文件删除时,会有事件通知,文件重命名会有删除和创建两种事件通知。监控文件夹名称修改不会触发通知。
使用apache的commons-io
maven依赖
复制<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.8.0</version>
</dependency>
创建一个文件监听器
复制import java.io.File;
import org.apache.commons.io.monitor.FileAlterationListener;
import org.apache.commons.io.monitor.FileAlterationObserver;
public class FileListener implements FileAlterationListener {
@Override
public void onStart(FileAlterationObserver observer) {
// System.out.println("onDirectoryCreate: " + observer.getDirectory());
}
@Override
public void onDirectoryCreate(File directory) {
System.out.println("onDirectoryCreate: " + directory);
}
@Override
public void onDirectoryChange(File directory) {
System.out.println("onDirectoryChange: " + directory);
}
@Override
public void onDirectoryDelete(File directory) {
System.out.println("onDirectoryDelete: " + directory);
}
@Override
public void onFileCreate(File file) {
System.out.println("onFileCreate: " + file);
}
@Override
public void onFileChange(File file) {
System.out.println("onFileChange: " + file);
}
@Override
public void onFileDelete(File file) {
System.out.println("onFileDelete: " + file);
}
@Override
public void onStop(FileAlterationObserver observer) {
// System.out.println("onStop: " + observer.getDirectory());
}
}
主程序
复制import java.io.File;
import java.util.concurrent.TimeUnit;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.HiddenFileFilter;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
public class FileListenerTest {
public static void main(String[] args) throws Exception {
// 监控目录
String rootDir = "D:\\java\\decompile";
// 轮询间隔 1 秒
long interval = TimeUnit.SECONDS.toMillis(1);
// 创建过滤器
IOFileFilter directories = FileFilterUtils.and(
FileFilterUtils.directoryFileFilter(),
HiddenFileFilter.VISIBLE);
IOFileFilter files = FileFilterUtils.and(
FileFilterUtils.fileFileFilter(),
FileFilterUtils.suffixFileFilter(".txt"));
IOFileFilter filter = FileFilterUtils.or(directories, files);
// 使用过滤器
FileAlterationObserver observer = new FileAlterationObserver(new File(rootDir), filter);
//添加文件监听器
observer.addListener(new FileListener());
//创建文件变化监听器
FileAlterationMonitor monitor = new FileAlterationMonitor(interval, observer);
// 开始监控
monitor.start();
}
}
一个文件可以有多个监听器,可以同时监控多个文件。FileAlterationMonitor 启动一个新的线程每次间隔1秒,扫描所有过滤后的文件和文件夹。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通