Java文件实时监控Commons-io

今天看到一网友写的 Java 文件监控,实时监控文件加载 ,突然想到Commons-io中已有此功能的实现,先温习下 写个简单的Demo:

有三种方式:

1、java common.io    内部实现是遍历的方式,小文件夹的效率还好,比如我测试60G的目录,就很慢很慢了。(我使用这个)

2、jdk 7 的watch service    //经测试基本不可用。在一个40g的很深的目录下去新建和删除文件5分钟都没结果。主要原因是需要对每一个Path进行注册监控。

3、jnotify                   直接调用windows的api,效率很高,也很简单,推荐使用。

common.io

需要java.io 2.1及其以上版本。

版本地址如下:

http://commons.apache.org/io/download_io.cgi

Java代码  

  1. package wy.util.filemonitor;
  2. import java.io.File;
  3. import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
  4. import org.apache.commons.io.monitor.FileAlterationObserver;
  5. import org.apache.log4j.Logger;
  6. /**
  7. * 文件变化监听器
  8. *
  9. * 在Apache的Commons-IO中有关于文件的监控功能的代码. 文件监控的原理如下:
  10. * 由文件监控类FileAlterationMonitor中的线程不停的扫描文件观察器FileAlterationObserver,
  11. * 如果有文件的变化,则根据相关的文件比较器,判断文件时新增,还是删除,还是更改。(默认为1000毫秒执行一次扫描)
  12. *
  13. * @author wy
  14. *
  15. */
  16. public class FileListener extends FileAlterationListenerAdaptor {
  17. private Logger log = Logger.getLogger(FileListener.class);
  18. /**
  19. * 文件创建执行
  20. */
  21. @Override
  22. public void onFileCreate(File file) {
  23. log.info("[新建]:" + file.getAbsolutePath());
  24. }
  25. /**
  26. * 文件创建修改
  27. */
  28. @Override
  29. public void onFileChange(File file) {
  30. log.info("[修改]:" + file.getAbsolutePath());
  31. }
  32. /**
  33. * 文件删除
  34. */
  35. @Override
  36. public void onFileDelete(File file) {
  37. log.info("[删除]:" + file.getAbsolutePath());
  38. }
  39. /**
  40. * 目录创建
  41. */
  42. @Override
  43. public void onDirectoryCreate(File directory) {
  44. log.info("[新建]:" + directory.getAbsolutePath());
  45. }
  46. /**
  47. * 目录修改
  48. */
  49. @Override
  50. public void onDirectoryChange(File directory) {
  51. log.info("[修改]:" + directory.getAbsolutePath());
  52. }
  53. /**
  54. * 目录删除
  55. */
  56. @Override
  57. public void onDirectoryDelete(File directory) {
  58. log.info("[删除]:" + directory.getAbsolutePath());
  59. }
  60. @Override
  61. public void onStart(FileAlterationObserver observer) {
  62. // TODO Auto-generated method stub
  63. super.onStart(observer);
  64. }
  65. @Override
  66. public void onStop(FileAlterationObserver observer) {
  67. // TODO Auto-generated method stub
  68. super.onStop(observer);
  69. }
  70. }

Java代码  

  1. package wy.util.filemonitor;
  2. import java.util.concurrent.TimeUnit;
  3. import org.apache.commons.io.filefilter.FileFilterUtils;
  4. import org.apache.commons.io.monitor.FileAlterationMonitor;
  5. import org.apache.commons.io.monitor.FileAlterationObserver;
  6. /**
  7. * 文件监控测试
  8. *
  9. * 在Apache的Commons-IO中有关于文件的监控功能的代码. 文件监控的原理如下:
  10. * 由文件监控类FileAlterationMonitor中的线程不停的扫描文件观察器FileAlterationObserver,
  11. * 如果有文件的变化,则根据相关的文件比较器,判断文件时新增,还是删除,还是更改。(默认为1000毫秒执行一次扫描)
  12. *
  13. * @author wy
  14. *
  15. */
  16. public class FileMonitorTest {
  17. /**
  18. * @param args
  19. */
  20. public static void main(String[] args) throws Exception{
  21. // 监控目录
  22. String rootDir = "F:\\Resume";
  23. // 轮询间隔 5 秒
  24. long interval = TimeUnit.SECONDS.toMillis(5);
  25. // 创建一个文件观察器用于处理文件的格式
  26. FileAlterationObserver _observer = new FileAlterationObserver(
  27. rootDir,
  28. FileFilterUtils.and(
  29. FileFilterUtils.fileFileFilter(),
  30. FileFilterUtils.suffixFileFilter(".txt")),  //过滤文件格式
  31. null);
  32. FileAlterationObserver observer = new FileAlterationObserver(rootDir);
  33. observer.addListener(new FileListener()); //设置文件变化监听器
  34. //创建文件变化监听器
  35. FileAlterationMonitor monitor = new FileAlterationMonitor(interval, observer);
  36. // 开始监控
  37. monitor.start();
  38. }
  39. }

看下结果:

==============================================================================

那位网友的帖子:http://www.iteye.com/topic/1127281

还有位网友的帖子:http://dyccsxg.iteye.com/blog/618993

两位的思路都很相似,基本上是采用线程轮询的方式,但在校验文件更新的时候一位采用的文件校验码及hash码,另一位是采用文件的最后修改时间(lastModified()
).

时间: 2024-10-06 09:56:06

Java文件实时监控Commons-io的相关文章

java利用WatchService实时监控某个目录下的文件变化并按行解析(注:附源代码)

首先说下需求:通过ftp上传约定格式的文件到服务器指定目录下,应用程序能实时监控该目录下文件变化,如果上传的文件格式符合要求,将将按照每一行读取解析再写入到数据库,解析完之后再将文件改名. 一. 一开始的思路 设置一个定时任务,每隔一分钟读取下指定目录下的文件变化,如果有满足格式的文件,就进行解析. 这种方式很繁琐,而且效率低,效率都消耗在了遍历.保存状态.对比状态上了! 而且无法利用OS的很多功能. 二. WatchService介绍 1. 该类的对象就是操作系统原生的文件系统监控器!我们都知

Java 文件变化加载监控,实时监控文件加载之Commons-io

Java 文件监控,实时监控文件加载 ,Commons-io中已有此功能的实现,如下代码所示: package wy.util.filemonitor; import java.io.File; import org.apache.commons.io.monitor.FileAlterationListenerAdaptor; import org.apache.commons.io.monitor.FileAlterationObserver; import org.apache.log4j

Caused by: java.lang.ClassNotFoundException: org.apache.commons.io.FileUtils

1.错误描述 警告: Could not create JarEntryRevision for [jar:file:/D:/MyEclipse/apache-tomcat-7.0.53/webapps/FirstSSH/WEB-INF/lib/struts2-core-2.3.16.3.jar]! java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils at com.opensymphony.xwork2.util.fs.

Tomcat中使用commons-io-2.5发生的错误java.lang.ClassNotFoundException: org.apache.commons.io.IOUtils

关键词:IntelliJ IDEA.Tomcat.commons-io-2.5.jar.java.lang.ClassNotFoundException: org.apache.commons.io.IOUtils 1.错误提示信息 图1 运行登录时错误信息 //Tomcat Localhost Log信息 org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [Servlet] in

java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream

java.lang.ClassNotFoundException: org.apache.commons.io.output.DeferredFileOutputStream at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1309) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(Webap

用java写一个远程视频监控系统,实时监控(类似直播)我想用RPT协议,不知道怎么把RPT协议集成到项目中

我最近在用java写一个远程视频监控系统,实时监控(类似直播)我想用RPT协议,不知道怎么把RPT协议集成到项目中,第一次写项目,写过这类项目的多多提意见,哪方面的意见都行,有代码或者demo的求赏给我,谢谢

IO流 创建java文件列表

package com.yyq; /* * 练习: * 将一个指定目录下的java文件的绝对路径,存储到一个文本文件中 * * 思路 1.对指定的目录进行递归 * 2.获取递归过程中所有的Java文件的路径 * 3.将这些路径存储到集合中 * 4.将集合中的数据存储到一个文件中 * // 存储到硬盘中 ,往硬盘整,数据的持久化,写到文件中,没用try catch */ import java.io.*; import java.util.*; public class JavaFileList

实时监控log文件

一个进程在运行,并在不断的写log,你需要实时监控log文件的更新(一般是debug时用),怎么办,不断的打开,关闭文件吗? 不用,至少有两个方法,来自两个很常用的命令: tail -f log.txt, 另外一个进程在写log,而你用tail,就可以实时的打印出新的内容 less log.txt, 然后如果要监控更新,按F,如果要暂停监控,可以CTRL+C, 这样就可以上下翻页查看,要继续监控了再按F即可.这个功能要比tail更强. 可以很容易的模拟一下: 在一个shell中持续更新文件: $

maven:java.lang.NoClassDefFoundError: org/apache/commons/io/Charsets

今天从git上down了一个第三方jar ,这个jar里面用到了  String resultUrl = String.format(url,            URLEncoder.encode(ticket, Charsets.UTF_8.name())); 然而执行到这里的时候,就报错了: java.lang.NoClassDefFoundError: org/apache/commons/io/Charsets 第一反应就是jar包冲突了,看了下依赖,果然是有问题,如图所示: com