近况

最近公司项目上并不忙,但本人却总是有非常大的焦虑感,
正如之前所言,我抛弃的已经抛弃了,想得到的还没有得到,人生无处不迷茫啊
害,我得放松心态吧,就算被开掉又能怎么样呢,如果人生是上帝给的一张旅游票
你本就是来看看的,又何必患得患失,过自己想要的人生吧,人生没有成败。

下面来看看如何使用Commons-io实现对文件的监控吧,也是网上百度就有的东西,记录下来方便查找

使用Commons-io的monitor下的相关类可以处理对文件进行监控,它采用的是观察者模式来实现的
(1)可以监控文件夹的创建、删除和修改
(2)可以监控文件的创建、删除和修改
(3)采用的是观察者模式来实现的
(4)采用线程去定时去刷新检测文件的变化情况
  • 导入依赖

    <dependency>
    	<groupId>commons-io</groupId>
    	<artifactId>commons-io</artifactId>
    	<version>2.7</version>
    </dependency>
  • 创建文件监听器,根据需要在不同的方法内实现对应的业务逻辑处理。

    public class FileListener extends FileAlterationListenerAdaptor {
    
    	@Override
    	public void onStart(FileAlterationObserver observer) {
    		super.onStart(observer);
    		System.out.println("onStart");
    	}
    
    	@Override
    	public void onDirectoryCreate(File directory) {
    		System.out.println("新建:" + directory.getAbsolutePath());
    	}
    
    	@Override
    	public void onDirectoryChange(File directory) {
    		System.out.println("修改:" + directory.getAbsolutePath());
    	}
    
    	@Override
    	public void onDirectoryDelete(File directory) {
    		System.out.println("删除:" + directory.getAbsolutePath());
    	}
    
    	@Override
    	public void onFileCreate(File file) {
    		String compressedPath = file.getAbsolutePath();
    		System.out.println("新建:" + compressedPath);
    		if (file.canRead()) {
    			// TODO 读取或重新加载文件内容
    			System.out.println("文件变更,进行处理");
    		}
    	}
    
    	@Override
    	public void onFileChange(File file) {
    		String compressedPath = file.getAbsolutePath();
    		System.out.println("修改:" + compressedPath);
    	}
    
    	@Override
    	public void onFileDelete(File file) {
    		System.out.println("删除:" + file.getAbsolutePath());
    	}
    
    	@Override
    	public void onStop(FileAlterationObserver observer) {
    		super.onStop(observer);
    		System.out.println("onStop");
    	}
    }
  • main方法测试

    public static void main(String[] args) throws Exception{
      // 监控目录
      String rootDir = "D:\\apache-tomcat-7.0.78";
      // 轮询间隔 5 秒
      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);
      //不使用过滤器
      //FileAlterationObserver observer = new FileAlterationObserver(new File(rootDir));
      observer.addListener(new FileListener());
      //创建文件变化监听器
      FileAlterationMonitor monitor = new FileAlterationMonitor(interval, observer);
      // 开始监控
      monitor.start();
    }
  • 你可以封装一个文件监控的工具类,核心就是创建一个观察者FileAlterationObserver,
    将文件路径Path和监听器FileAlterationListener进行封装,然后交给FileAlterationMonitor。

    public class FileMonitor {
    
    	private FileAlterationMonitor monitor;
    
    	public FileMonitor(long interval) {
    		monitor = new FileAlterationMonitor(interval);
    	}
    
    	/**
    	 * 给文件添加监听
    	 *
    	 * @param path     文件路径
    	 * @param listener 文件监听器
    	 */
    	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();
    	}
    }
  • main方法测试

    public class FileRunner {
    	public static void main(String[] args) throws Exception {
    		FileMonitor fileMonitor = new FileMonitor(1000);
    		fileMonitor.monitor("/Users/zzs/temp/", new FileListener());
    		fileMonitor.start();
    	}
    }