• 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秒,扫描所有过滤后的文件和文件夹。

  • 相关阅读:
    MyBatis+Oracle
    JAVA接口,json传递
    Oracle学习笔记(二)
    Oracle学习笔记(一)
    数据库事务四大特性之隔离性
    数据库事务四大特性(ACID)
    多表连接时条件放在 on 与 where 后面的区别
    tomcat request.getParamter() 乱码解决方案 Filter版本
    POI excel下载 中文名 浏览器兼容解决
    天马行空
  • 原文地址:https://www.cnblogs.com/strongmore/p/14654858.html
Copyright © 2020-2023  润新知