WatchService文件监听器

本文详细介绍Java中WatchService的使用方法,展示了如何利用操作系统原生的文件系统监控器高效监控文件变化,包括创建WatchService实例,注册监听事件,以及处理文件的创建、删除和修改事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WatchService介绍

1、 该类的对象就是操作系统原生的文件系统监控器!我们都知道OS自己的文件系统监控器可以监控系统上所有文件的变化,这种监控是无需遍历、无需比较的,是一种基于信号收发的监控,因此效率一定是最高的;现在Java对其进行了包装,可以直接在Java程序    中使用OS的文件系统监控器了;

2、 获取当前OS平台下的文件系统监控器:

     i. WatchService watcher = FileSystems.getDefault().newWatchService();

     ii. 从FileSystems这个类名就可以看出这肯定是属于OS平台文件系统的,接下来可以看出这一连串方法直接可以得到一个文件监控器;

WatchService使用

@Slf4j
public class DirectoryTargetMonitor {
    //文件监听器,通过操作系统原生文件系统来运行
    private WatchService watchService;
    //监听路径
    private final Path path;

    private volatile boolean start = false;

    public DirectoryTargetMonitor(String targetPath) {
        this.path = Paths.get(targetPath);
    }

    public void startMonitor() throws Exception {
        //watchService实例化
        this.watchService = FileSystems.getDefault().newWatchService();
        //监控文件的 修改  增加  删除
        this.path.register(watchService,StandardWatchEventKinds.ENTRY_CREATE,
                StandardWatchEventKinds.ENTRY_DELETE,StandardWatchEventKinds.ENTRY_MODIFY);
        this.start =true;
        while (start){
            WatchKey watchKey = null;
            try {
                log.info("开始监控");
                //获取变化信息的监控池,没有则一直阻塞
                watchKey = watchService.take();
                //获取事件列表
                List<WatchEvent<?>> watchEvents = watchKey.pollEvents();
                log.info("获取事件");
                for (WatchEvent<?> watchEvent : watchEvents) {
                    //监听事件类型
                    WatchEvent.Kind<?> kind = watchEvent.kind();
                    //得到监听文件的路径(文件名)
                    Path name =(Path) watchEvent.context();
                    //获取全路径 path + name
                    Path allPath = this.path.resolve(name);
                    log.info("{}:{}:{}",kind,allPath,name);
                }
            } catch (Exception e) {
                System.out.println("被打断");
                e.printStackTrace();
                this.start =false;
            } finally {
                //每次得到新事件后,都需要重置
                if (watchKey != null) watchKey.reset();
            }
        }
    }
    public void stopMonitor() throws Exception {
        log.info("目录 {} 将要关闭监听",path);
        this.start = false;
        this.watchService.close();
        log.info("目录 {} 已经关闭监听",path);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值