2019独角兽企业重金招聘Python工程师标准>>>

Monitor directory changes

Quartz定时器 or Timer + Thread:开启线程定时去读取文件内容,查看文件内容是否发生变化,但对于文件内容过大或者过于复杂的(不推荐),或者通过定时检查文件的修改时间lastModifyTime,但是可能出现问题(不推荐),还有通过读取文件流生成MD5对应的MD5码,如果MD5不同则文件发生变化,对于大型文件也有问题,适合小文件。

JDK watch:使用JDK 7自带的 watch。

Commons-io.monitor:File Monitor - a component for monitoring file system events。

JDK watch

有三种监听事件类型,ENTRY_CREATE、ENTRY_DELETE、ENTRY_MODIFY。Watch只能监控目录,而不能监听某个具体的文件,需手动实现监听具体的文件。如果直接监听文件,则会报错 NotDirectoryException。

public static void jdkWatchDirectory() {// define a folder rootPath myDir = Paths.get("D:/deploy");try {WatchService watcher = myDir.getFileSystem().newWatchService();myDir.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY);WatchKey watckKey = watcher.take();while (true) {List<WatchEvent<?>> events = watckKey.pollEvents();for (WatchEvent event : events)if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY)System.out.println("Modify: " + event.context().toString());}} catch (Exception e) {System.out.println("Error: " + e.toString());}}

使用JDK Watch方式监控Directory,当文件内容发生变更时,有可能会触发两次MODIFY。

Commons-io Monitor

Commons-io Monitor class as follows:

FileAlterationListener Interface: A listener that receives events of file system modifications.

public interface FileAlterationListener {/*** File system observer started checking event.** @param observer The file system observer*/void onStart(final FileAlterationObserver observer);/*** Directory created Event.* * @param directory The directory created*/void onDirectoryCreate(final File directory);/*** Directory changed Event.* * @param directory The directory changed*/void onDirectoryChange(final File directory);/*** Directory deleted Event.* * @param directory The directory deleted*/void onDirectoryDelete(final File directory);/*** File created Event.* * @param file The file created*/void onFileCreate(final File file);/*** File changed Event.* * @param file The file changed*/void onFileChange(final File file);/*** File deleted Event.* * @param file The file deleted*/void onFileDelete(final File file);/*** File system observer finished checking event.** @param observer The file system observer*/void onStop(final FileAlterationObserver observer);
}

FileAlterationListenerAdaptor:a dapter ,fileAlterationListener implementation that does nothing.rewrite required methods。

example

public class FileListener extends FileAlterationListenerAdaptor {@Override  public void onFileChange(File file) {if (file.getName().contains("mail_profile.xml")) {// TODO do something}System.out.println("Modify:" + file.getAbsolutePath());  }  @Override  public void onStart(FileAlterationObserver observer) {  super.onStart(observer);  }  @Override  public void onStop(FileAlterationObserver observer) {  super.onStop(observer);  }  public static void main(String[] args) throws Exception{    String targetDirectory = "D:\\deploy";    long listeningInterval = TimeUnit.SECONDS.toMillis(2);  FileAlterationObserver observer = new FileAlterationObserver(targetDirectory);observer.addListener(new FileListener());    FileAlterationMonitor monitor = new FileAlterationMonitor(listeningInterval, observer); monitor.start();    }
}

Monitor directory "d:\deploy" file changes. 如果想监听某类文件的变化,需要添加FileFilter。

/*** Construct an observer for the specified directory and file filter.** @param directoryName the name of the directory to observe* @param fileFilter The file filter or null if none*/public FileAlterationObserver(String directoryName, FileFilter fileFilter) {this(new File(directoryName), fileFilter);}

implementation

String targetDirectory = "D:\\deploy";
long listeningInterval = TimeUnit.SECONDS.toMillis(2);
IOFileFilter fileFilter = FileFilterUtils.and(FileFilterUtils.fileFileFilter(),FileFilterUtils.suffixFileFilter(".xml"),FileFilterUtils.nameFileFilter("mail_profile.xml"));
Collection<File> files = FileUtils.listFiles(new File(rootDir),fileFilter, TrueFileFilter.INSTANCE);
System.out.println(files);
FileAlterationObserver observerFilter = new FileAlterationObserver(targetDirectory, fileFilter);
observerFilter.addListener(new FileListener());
FileAlterationMonitor monitor = new FileAlterationMonitor(listeningInterval, observerFilter );
monitor.start();    

但是FileFilter没有生效,并且整个目录的文件变化都未触发事件。所以只能不加FileFilter,并且在onFileChange中判断需要监听的具体类型或具体某个文件。

转载于:https://my.oschina.net/u/573643/blog/739940

Directory monitor相关推荐

  1. Python: Monitoring a Directory

    2019独角兽企业重金招聘Python工程师标准>>> Basic mtime + checksum + directory traversal Code #!/usr/bin/en ...

  2. AndroidStudio 3.0中之后无法打开DDMS [Android Device Monitor] 问题

    转自black_bird_cn的博客,如有冒犯请留言联系 一.AndroidStudio 3.0中之后无法打开Android Device Monitor 最近升级了AS后发现在在菜单栏中的Tools ...

  3. Boost asio 官方教程简介

    1. 概述 本章介绍了 Boost C++ 库 Asio,它是异步输入输出的核心. 名字本身就说明了一切:Asio 意即异步输入/输出. 该库可以让 C++ 异步地处理数据,且平台独立. 异步数据处理 ...

  4. oracle 9i手动启动数据库,Oracle9iAS (之五): 手工起动,关闭系统

    下面是偶在 UNIX 上手工启动和关闭 Oracle9iAS 的步骤,分三部份: 1. 建立环境参数文件,如你用csh/tcsh, 建立 inf.csh, ias.csh 两个文件.如你用sh/ksh ...

  5. Exchange 2003 设计与体系结构

    概述 Microsoft 的运营技术组(OTG)最近部署了 Microsoft Exchange Server 2003 - 该公司行业领先的企业通信应用程序的最新版本.OTG 不仅通过运行 IT 应 ...

  6. 微软怎么设计Exchange 2003的体系结构

    背景介绍 Microsoft 的通信基础结构种类繁多,在全球 75 个地方运行着超过 100 台邮箱服务器,这些服务器使用各种不可伸缩的硬件配置. 解决方案 OTG 升级了其全球的通信基础结构,使用集 ...

  7. Oracle通过定时任务+dblink+存储过程传数据到中间库

    --- 1.先看看有没有 放临时表 的目录,没有创建下:或者改放其他目录 cd /usr/local/oracle/oradata--- 2.将目录所有者换成oracle chown -R oracl ...

  8. 学android逆向能干,教我兄弟学Android逆向04

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? <教我兄弟学Android逆向>04的课后作业. 教程笔记 将apk反编译成smali文件 AndroidK ...

  9. C/C++ 开发 boost 库参考手册整理(2) 【学习笔记】

    文档声明: 以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正.并且该文档在后期会随着学习的深入不断补充完善.感谢各位的参考查看. 笔记资料仅供学习交流使用,转载请标明出处 ...

最新文章

  1. 在纸上写好一个c语言程序后,上机运行的基本步骤为,c基本概念(选择题).docx
  2. 博弈入门学习的博客[资源汇总]
  3. Java实现文件拷贝
  4. 微信登录提示逻辑不正确_Axure RP 9 教程:模拟登录注册
  5. 关节点(atriculation point)算法
  6. mysql网络安装教程_详细教程--MySQL的安装与配置
  7. 【Python 】单引号和双引号有什么区别?
  8. Zookeeper 安装和配置---学习二
  9. unity webgl读写txt文件_VB 读写txt文件
  10. DSP中两个延时函数的区别(转)
  11. cookie 保存导航菜单的展开状态
  12. android带动画的饼图,Android部分源码资源共享(视屏转GIF图片工具、仿抖音、仿朋友圈、仿红包、饼状图、引导图,图灵源码等)...
  13. windows系统 Git Server git服务器自己搭建 (基于 Gitblit or Gogs )
  14. 快速傅里叶变换python_SciPyTutorial-快速傅立叶逆变换ifft
  15. C语言的32个关键字和9种控制语句
  16. 前端面试 - 项目流程
  17. Scratch角色的绘制与中心点
  18. 交换机端口与MAC绑定
  19. HTML5学习系列之表单与文件
  20. 计算机计算编码知识题库,计算机基础知识复习题库

热门文章

  1. php对象复制,PHP 对象复制 - 对象复制 - phpStudy
  2. 输入n个字符串字典序排序_30个Python奇淫技巧集
  3. 《深入理解Java虚拟机》第7章 虚拟机类加载机制
  4. C# processbar设置
  5. linux目录文件变化,Linux下监测目录或文件的变化---inotify
  6. python io密集 多线程_python多进程和多线程究竟谁更快(详解)
  7. 输入三科成绩 C语言,C语言题,对我的程序找错修改。输入10个学生学号,三科成绩,求总成绩和平均分,并按成绩由高到低输出...
  8. 无锡太湖学院计算机科学与技术宿舍,无锡太湖学院宿舍怎么样
  9. 第九章 OGRE中的整个流程
  10. 基于迁移学习的农作物病虫害检测方法研究与应用