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