Commons-IO 2.0中文件监控器的源代码
???????????? 在项目中不同数据库中数据迁移的问题中,通过程序或者工具把数据生成文件之后把文件,然后通过文件监控器监控文件的创建,如果有文件的变化,则将新的数据文件的导入到另一个数据库中,实现不同数据库的数据迁移。
??????????? 在Apache的Commons-IO 2.0中有关于文件的监控功能的代码,在项目中采用Commons-IO 2.0中代码实现文件变化的监控。
????????????在Commons-IO 2.0中文件监控的原理如下:
?? 由文件监控类FileAlterationMonitor中的线程不停的扫描文件观察器FileAlterationObserver,如果有文件的变化,则根据相关的文件比较器,判断文件时新增,还是删除,还是更改。(默认为1000毫秒执行一次扫描)
?
?
其中文件变化的监控器接口FileAlterationListener如下:
package org.apache.commons.io.monitor;import java.io.File;public abstract interface FileAlterationListener{ public abstract void onStart(FileAlterationObserver paramFileAlterationObserver); public abstract void onDirectoryCreate(File paramFile); public abstract void onDirectoryChange(File paramFile); public abstract void onDirectoryDelete(File paramFile); public abstract void onFileCreate(File paramFile); public abstract void onFileChange(File paramFile); public abstract void onFileDelete(File paramFile); public abstract void onStop(FileAlterationObserver paramFileAlterationObserver);}?
?
测试类代码如下:
?
package easyway.tbs.app.files;import java.io.File;import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;/** * 文件变化监听器 * * @author longgangbai * */public class EasywayFileListener extends FileAlterationListenerAdaptor{ /** * 文件创建执行 */@Overridepublic void onFileCreate(File file) {System.out.println("[新建]:" + file.getAbsolutePath());} /** * 文件创建修改 */@Overridepublic void onFileChange(File file) {System.out.println("[修改]:" + file.getAbsolutePath());} /** * 文件删除 */@Overridepublic void onFileDelete(File file) {System.out.println("[删除]:" + file.getAbsolutePath());}}?
?
测试代码如下:
package easyway.tbs.app.files;import java.util.concurrent.TimeUnit;import org.apache.commons.io.filefilter.FileFilterUtils;import org.apache.commons.io.monitor.FileAlterationMonitor;import org.apache.commons.io.monitor.FileAlterationObserver;/** * 文件监控测试 * @author longgangbai * */public class FileMonitorTest {/** * @param args * @throws Exception */public static void main(String[] args) throws Exception {// 监控目录String rootDir = "c:\\upload";// 轮询间隔 5 秒long interval = TimeUnit.SECONDS.toMillis(5);// 创建一个文件观察器用于处理文件的格式FileAlterationObserver observer = new FileAlterationObserver( rootDir, FileFilterUtils.and( FileFilterUtils.fileFileFilter(), FileFilterUtils.suffixFileFilter(".doc")), //过滤文件格式 null);observer.addListener(new EasywayFileListener()); //设置文件变化监听器//创建文件变化监听器FileAlterationMonitor monitor = new FileAlterationMonitor(interval,observer);// 开始监控monitor.start();}}?
1 楼 trunk 2011-06-20 楼主 是否有EasywayFileListener中的方法会被执行2次。。。例如你修改有一个文件,那么onFileChange方法被执行2次。。。。。。? 2 楼 trunk 2011-06-20 我用的是2.0.1 3 楼 trunk 2011-06-20 2.0也是有同样的问题啊。。刚刚找了个2.0的包试了下。。。 4 楼 longgangbai 2011-06-22 trunk 写道2.0也是有同样的问题啊。。刚刚找了个2.0的包试了下。。。
我执行了同样的实验,修改一次,执行一次,没有你说的那种情况。 5 楼 longgangbai 2011-06-22 trunk 写道楼主 是否有EasywayFileListener中的方法会被执行2次。。。
例如你修改有一个文件,那么onFileChange方法被执行2次。。。。。。?
你说的情况是将文件打开一次,写入文件一部分保存,在写入一部分保存,那么会执行两次! 6 楼 wyz666888 2012-07-24 谢谢博主分享 我找了好久 试了好多方法 终于找到好使的了 我测试了 修改文件的时候不会出现 被执行两次 的情况 我昨天用 JNotify 做的文件监控 但是修改的时候 执行两次操作 今天早上弄到现在 我实现弄不好了 就想换个方法吧 哈哈 就找到了楼主共享的方法 不错哈 借鉴了 最后还是十分感谢 7 楼 longgangbai 2012-07-30 wyz666888 写道谢谢博主分享 我找了好久 试了好多方法 终于找到好使的了 我测试了 修改文件的时候不会出现 被执行两次 的情况 我昨天用 JNotify 做的文件监控 但是修改的时候 执行两次操作 今天早上弄到现在 我实现弄不好了 就想换个方法吧 哈哈 就找到了楼主共享的方法 不错哈 借鉴了 最后还是十分感谢
知识,分享