借助JDK7中WatchService实现文件变更监听

import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import java.io.IOException;
import java.nio.file.*;
import java.util.Objects;
import java.util.Properties;

/**
 * @author Created by niugang on 2019/10/16/19:41
 */
@SuppressWarnings("InfiniteLoopStatement")
public class WatchServiceDemo {
    private static String fileName="mail.properties";
    private static FileSystemResource classPathResource = null;
    private static WatchService watchService = null;

    public static Properties properties;

    static {

        String filePath = "D:/home/conf/mail.properties";
        //从文件系统加载文件
        classPathResource = new FileSystemResource(filePath);
        //监听filenam所在的目录下的文件修改、删除事件
        try {
            watchService = FileSystems.getDefault().newWatchService();
            Paths.get(classPathResource.getFile().getParent()).register(watchService,
                    StandardWatchEventKinds.ENTRY_MODIFY,
                    StandardWatchEventKinds.ENTRY_DELETE
            );
            properties = PropertiesLoaderUtils.loadProperties(classPathResource);
        } catch (IOException e) {
            e.printStackTrace();
        }

        Thread watchThread = new Thread() {
            @Override
            public void run() {

                while (true) {
                    WatchKey watchKey = null;
                    try {
                        watchKey = watchService.take();
                        for (WatchEvent<?> event : watchKey.pollEvents()) {
                            if (Objects.equals(event.context().toString(), fileName)) {
                                properties = PropertiesLoaderUtils.loadProperties(classPathResource);
                                break;
                            }
                        }
                        watchKey.reset();
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        if (watchKey != null) {
                            watchKey.reset();
                        }
                    }

                }
            }
        };
        //设置为守护线程
        watchThread.setDaemon(true);
        watchThread.start();

       //JVM停止时 关闭
        Runtime.getRuntime().addShutdownHook(new Thread(){
            @Override
            public void run() {
                try {
                    watchService.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

//
//    public static void main(String[] args) throws InterruptedException {
//        //验证  启动main方法   修改mail.properties文件 看控制台输出内容的变化
//        while (true){
//            System.out.println(properties);
//            Thread.sleep(5000);
//        }
//
//
//
//    }

}

微信公众号


JAVA程序猿成长之路
分享资源,记录程序猿成长点滴。专注于Java,Spring,SpringBoot,SpringCloud,分布式,微服务。

原文地址:https://www.cnblogs.com/niugang0920/p/12187009.html

时间: 2024-11-08 12:11:31

借助JDK7中WatchService实现文件变更监听的相关文章

Android中Button的五种监听事件

简单聊一下Android中Button的五种监听事件: 1.在布局文件中为button添加onClick属性,Activity实现其方法2.匿名内部类作为事件监听器类3.内部类作为监听器4.Activity本身作为事件监听器,实现onClickListener5.外部类作为监听器 ButtonListenerActivity.class public class ButtonListenerActivity extends AppCompatActivity implements View.On

Android中Preference的使用以及监听事件分析

> 在Android系统源码中,绝大多数应用程序的UI布局采用了Preference的布局结构,而不是我们平时在模拟器中构建应用程序时使用的View布局结构,例如,Setting模块中布局.当然,凡事都有例外,FMRadio应用程序中则使用了View布局结构(可能是该应用程序是marvel公司提供的,如果由google公司做,那可说不准).归根到底,Preference布局结构和View的布局结构本质上还是大同小异,Preference的优点在于布局界面的可控性和高效率以及可存储值的简洁性(每个

通过在web.xml文件增加监听,初始化一些常用的环境,如jdbc

通过在web.xml文件增加监听,可以到达在启动工程的时候,初始化一些常用的环境,如jdbc等. 监听(Listener) web文件添加 <listener> <listener-class>cn.ro.common.InitListener</listener-class> </listener> 添加InitListener类,如下 package cn.ro.common; import javax.servlet.ServletContextEve

Android中Activity中左右滑动手势的监听

<pre name="code" class="java">/* * 完成对左右划屏 */ @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: prev.set(event.getX(), event.getY()); break; case MotionEvent.ACT

Java可以如何实现文件的监听

应用中使用logback作为日志输出组件的话,大部分会去配置 logback.xml 这个文件,而且生产环境下,直接去修改logback.xml文件中的日志级别,不用重启应用就可以生效 那么,这个功能是怎么实现的呢?应用中使用logback作为日志输出组件的话,大部分会去配置 logback.xml 这个文件,而且生产环境下,直接去修改logback.xml文件中的日志级别,不用重启应用就可以生效 那么,这个功能是怎么实现的呢? I. 问题描述及分析 针对上面的这个问题,首先抛出一个实际的cas

调用系统下载服务下载文件。监听下载完成拿到downloadid和filename

public class DownLoadAPK { @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static long downloadAPK(DownloadManager downloadManager, String apkUrl, String name, String desc){ DownloadManager.Request request = new DownloadManager.Request(Uri.parse(apk

Android中ListView的item按钮监听错乱问题解决办法

在开发中经常会遇到这样的问题,做了一个列表,给列表的每一项添加了按钮监听事件,但是在列表的数据很多的时候经常会出现点击后错乱的问题.对于这种问题,我们在程序中可能都有自己的解决办法,但是你也许第一次发现这个问题的时候会跟我之前一样手足无措. 那么现在我们可以分析一下这种问题的根本原因. 首先,我们来看一下一个出错的BaseAdapter. package com.example.listdelectdemo; import java.util.ArrayList; import android.

消费滚动滴log日志文件(flume监听,kafka消费,zookeeper协同)

第一步:数据源 手写程序实现自动生成如下格式的日志文件: 15837312345,13737312345,2017-01-09 08:09:10,0360 打包放到服务器,使用如下命令执行,模拟持续不断的日志文件: java -cp ct_producter-1.0-SNAPSHOT.jar producter.ProductLog ./awen.tsv 第二步:监听log.tsv日志 使用Flume监控滚动的awen.tsv日志,编写flume # Name the components on

Android实战简易教程-第十五枪(实现ListView中Button点击事件监听)

1.main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" androi