• Java 实现对文件系统的监控


    在开发中经常会用到监控文件或是目录的状态,如果你还在手写轮巡扫描文件的话,那你久out了。

    1. Commons io为我们提供了一套可靠、高性能的一套文件系统监控API

    1.1. 需要的jar包如下,具体版本可根据自己需要选取:

    • commons-logging-1.1.1.jar
    • log4j-1.2.15.jar

    1.2. 在文件监控系统的中,首先要理解几个角色:

    • Observer:观察者,拥有文件路径、文件过滤器、文件比较器(监控器用它来判断文件的状态变化:新增、修改、删除、等等),可以向他添加相关的监听器;
    • Listener:监听器,当文件系统发生变化时,将会执行它的相关方法。其实,在文件状态发生变化时,观察者会根据文件比较器来拿到文件的变化状态,根据变化状态的不同来调用监听器中不同的方法;
    • Monitor:监控器,可设置监控文件系统的时间间隔、文件观察者等信息。

    1.3. 代码实现步骤如下:

    1.3.1. 实现监听器

    import java.io.File;
    
    import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
    import org.apache.commons.io.monitor.FileAlterationObserver;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    
    /**
     * 文件监听器
     * @author leocook(leocook@163.com)
     * @version 1.0
     * @date 2014-06-30
     */
    public class MyFileListener extends FileAlterationListenerAdaptor {
        private static Log log = LogFactory.getLog(MyFileListener.class);
        /**
         * 目录发生变化
         * @param directory 发生变化的目录
         */
        @Override
        public void onDirectoryChange(File directory) {
            super.onDirectoryChange(directory);
            log.info("文件夹改变:" +directory.getAbsolutePath());
        }
    
        /**
         * 新建目录
         * @param directory 被新建的目录
         */
        @Override
        public void onDirectoryCreate(File directory) {
            super.onDirectoryCreate(directory);
            log.info("新建目录:" +directory.getAbsolutePath());
        }
    
        /**
         * 删除目录
         * @param directory 被删除目录
         */
        @Override
        public void onDirectoryDelete(File directory) {
            super.onDirectoryDelete(directory);
            log.info("删除目录:" +directory.getAbsolutePath());
        }
    
        /**
         * 文件发生变化
         * @param file 发生变化的文件
         */
        @Override
        public void onFileChange(File file) {
            super.onFileChange(file);
            log.info("修改文件:" +file.getAbsolutePath());
        }
    
        /**
         * 新建文件
         * @param file 被新建的文件
         */
        @Override
        public void onFileCreate(File file) {
            super.onFileCreate(file);
            log.info("新建文件:"+file.getAbsolutePath());
        }
    
        /**
         * 删除文件
         * @param file 被删除的文件
         */
        @Override
        public void onFileDelete(File file) {
            super.onFileDelete(file);
            log.info("删除文件:" +file.getAbsolutePath());
        }
        
        /**
         * 检查文件开始
         * @param observer 文件观察者
         */
        @Override
        public void onStart(FileAlterationObserver observer) {
            super.onStart(observer);
    //        log.info("开始检查...");
        }
    
        /**
         * 检查文件结束
         * @param observer 文件观察者
         */
        @Override
        public void onStop(FileAlterationObserver observer) {
            super.onStop(observer);
    //        log.info("结束检查...");
        }
    }

    1.3.2. 观察者、监控器的调用

    import org.apache.commons.io.monitor.FileAlterationMonitor;
    import org.apache.commons.io.monitor.FileAlterationObserver;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    
    /**
     * 文件系统监测测试类
     * @author leocook(leocook@163.com)
     * @version 1.0
     * @date 2014-06-30
     */
    public class Main {
        private static Log log = LogFactory.getLog(Main.class);
        
        /**
         * 测试文件系统监测
         * @param String[] args
         */
        public static void main(String[] args) {
            long interval = 1000;
            
            final String path = "/home/leocook/test";
            FileAlterationObserver observer = null;
            
            try {
                observer = new FileAlterationObserver(path, null, null);
                //添加监听器
                observer.addListener(new MyFileListener());
                
                FileAlterationMonitor monitor = new FileAlterationMonitor(interval, observer);
                monitor.start();
            } catch (Exception e) {
                log.error("Exception", e);
            }
        }
    }

     1.4. Commons io包中对文件系统监控体系中,还有类org.apache.commons.io.monitor.FileEntry,关于它的具体用法笔者不再一一介绍。

     1.5. 参考链接

    • http://blog.csdn.net/xiaoyezi1001/article/details/28095281
  • 相关阅读:
    如何调试在OJ中的代码
    在linux命令行中调试在OJ上的c++代码
    jar包
    stanford core
    decode encode
    访问服务器,远程访问linux主机
    代码18
    删除列表中的元素
    if __name__ == '__main__'
    苹果要求全部新app以及版本号更新必须支持iOS 8 SDK和64-bit
  • 原文地址:https://www.cnblogs.com/leocook/p/java_filesystem_monitor.html
Copyright © 2020-2023  润新知