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);
    

    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要监听FTP文件夹的变化,你需要使用FTPClient类来连接到FTP服务器。然后,你可以使用FTPClient类提供的一些方法来监视FTP文件夹的变化,例如: 1. 使用FTPClient.changeWorkingDirectory()方法进入要监视文件夹。 2. 使用FTPClient.listFiles()方法获取当前文件夹中的所有文件和子文件夹。 3. 使用FTPClient.retrieveFileStream()方法获取指定文件的输入流,并使用BufferedReader读取输入流中的内容。 你可以将以上步骤封装在一个循环中,以便每隔一段时间重复执行。如果发现有新的文件文件夹被添加到FTP文件夹中,就可以执行相应的操作。 以下是一个示例代码片段,可以用来监听FTP文件夹的变化: ``` FTPClient client = new FTPClient(); client.connect("ftp.example.com"); client.login("username", "password"); while (true) { client.changeWorkingDirectory("/path/to/ftp/folder"); FTPFile[] files = client.listFiles(); for (FTPFile file : files) { if (file.isFile()) { InputStream inputStream = client.retrieveFileStream(file.getName()); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); // 处理文件内容 reader.close(); inputStream.close(); } else if (file.isDirectory()) { // 处理子文件夹 } } Thread.sleep(5000); // 暂停5秒钟 } client.logout(); client.disconnect(); ``` 请注意,上述代码仅提供了基本的框架。你需要根据自己的需求进行修改和完善。此外,还需要考虑到连接失败、文件读取异常等情况的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值