java 监视文件夹下的文件是否发生变化,当发生变时重新获取文件夹里的内容

  • Post author:
  • Post category:java


注意:1.引入FileAlterationListenerAdaptor

2.listener不被spring容器管理,无法通过注解获取spring管理的bean。本例子用静态属性对其进行赋值。

1、文件监听器

/**

  • 文件夹监听器

  • 检测到文件夹更新,则更新缓存内容

    */

    public class FileListener extends FileAlterationListenerAdaptor {

    private static LocationService locationService;

    private static MicsDatapointSystemService micsDatapointSystemService;

    private static UploadProperties uploadProperties;

    private static RedisTemplate<Object, Object> redisTemplate;

    public static LocationService getLocationService() {


    return locationService;

    }

    public static void setLocationService(LocationService locationService) {


    FileListener.locationService = locationService;

    }

    public static MicsDatapointSystemService getMicsDatapointSystemService() {


    return micsDatapointSystemService;

    }

    public static void setMicsDatapointSystemService(MicsDatapointSystemService micsDatapointSystemService) {


    FileListener.micsDatapointSystemService = micsDatapointSystemService;

    }

    public static UploadProperties getUploadProperties() {


    return uploadProperties;

    }

    public static void setUploadProperties(UploadProperties uploadProperties) {


    FileListener.uploadProperties = uploadProperties;

    }

    public static RedisTemplate<Object, Object> getRedisTemplate() {


    return redisTemplate;

    }

    public static void setRedisTemplate(RedisTemplate<Object, Object> redisTemplate) {


    FileListener.redisTemplate = redisTemplate;

    }

    /**

    • 文件创建执行

      */

      public void onFileCreate(File file) {


      try {


      setDataInRedis();//注入缓存

      } catch (Exception e) {


      e.printStackTrace();

      }

      }

    /**

    • 文件创建修改

      */

      public void onFileChange(File file) {


      try {


      setDataInRedis();

      } catch (Exception e) {


      e.printStackTrace();

      }

      }

    /**

    • 文件删除

      */

      public void onFileDelete(File file) {


      try {


      setDataInRedis();

      } catch (Exception e) {


      e.printStackTrace();

      }

      }

    /**

    • 目录创建

      */

      public void onDirectoryCreate(File directory) {


      try {


      setDataInRedis();

      } catch (Exception e) {


      e.printStackTrace();

      }

      }

    /**

    • 目录修改

      */

      public void onDirectoryChange(File directory) {


      try {


      setDataInRedis();

      } catch (Exception e) {


      e.printStackTrace();

      }

      }

    /**

    • 目录删除

      */

      public void onDirectoryDelete(File directory) {


      try {


      setDataInRedis();

      } catch (Exception e) {


      e.printStackTrace();

      }

      }

    public void onStart(FileAlterationObserver observer) {


    super.onStart(observer);

    }

    public void onStop(FileAlterationObserver observer) {


    super.onStop(observer);

    }

2、 文件夹变化观察

public class FileMonitor {


FileAlterationMonitor monitor = null;

public FileMonitor(long interval) throws Exception {
    monitor = new FileAlterationMonitor(interval);
}

public void monitor(String path, FileAlterationListener listener) {
    FileAlterationObserver observer = new FileAlterationObserver(new File(path));
    monitor.addObserver(observer);
    observer.addListener(listener);
}

public void stop() throws Exception {
    monitor.stop();
}

public void start() throws Exception {
    monitor.start();
}

}

3、项目启动则开始监听(第一次查询数据并存入redis),并为listener里的静态属性赋值

/**

  • 项目启动后则执行文件夹变化监听工作;

  • 并查询一次组态页面的数据放缓存里;

    */

    @Component

    @Order(value = 1)

    public class FileInitRun implements CommandLineRunner {


    @Autowired

    LocationService locationService;

    @Autowired

    MicsDatapointSystemService micsDatapointSystemService;

    @Autowired

    RedisTemplate<Object, Object> redisTemplate;

    @Autowired

    UploadProperties uploadProperties;

    @Override

    public void run(String… args) throws Exception {

     FileMonitor fileMonitor = new FileMonitor(1000l);
     fileMonitor.monitor(uploadProperties.getConfigurationPage(),new FileListener());
     fileMonitor.start();
    
     //解决listener注入不了spring容器对象的问题
     FileListener.setLocationService(locationService);
     FileListener.setMicsDatapointSystemService(micsDatapointSystemService);
     FileListener.setUploadProperties(uploadProperties);
     FileListener.setRedisTemplate(redisTemplate);
    

    }



版权声明:本文为qq_40823910原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。