Java实现文件夹下文件实时监控

摘要:
1、 Commons io方法1.Commons io监视器下的相关类可以用于监视文件。它使用观察者模式来监视文件夹的创建、删除和修改。它使用观察者模式来监视文件的创建、删除和修改。它使用线程定期刷新和检测文件中的更改。2.引入commons io包需要2.0以上。?

一、commons-io方法

1、使用Commons-io的monitor下的相关类可以处理对文件进行监控,它采用的是观察者模式来实现的

  • (1)可以监控文件夹的创建、删除和修改
  • (2)可以监控文件的创建、删除和修改
  • (3)采用的是观察者模式来实现的
  • (4)采用线程去定时去刷新检测文件的变化情况

2、引入commons-io包,需要2.0以上。

1
2
3
4
5
6
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>

3、编写继承FileAlterationListenerAdaptor的类FileListener。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
importjava.io.File;
importorg.apache.commons.io.monitor.FileAlterationListenerAdaptor;
importorg.apache.commons.io.monitor.FileAlterationObserver;
importorg.apache.log4j.Logger;
/**
* 文件变化监听器
* 在Apache的Commons-IO中有关于文件的监控功能的代码. 文件监控的原理如下:
* 由文件监控类FileAlterationMonitor中的线程不停的扫描文件观察器FileAlterationObserver,
* 如果有文件的变化,则根据相关的文件比较器,判断文件时新增,还是删除,还是更改。(默认为1000毫秒执行一次扫描)
*/
publicclassFileListener extendsFileAlterationListenerAdaptor {
privateLogger log = Logger.getLogger(FileListener.class);
/**
* 文件创建执行
*/
publicvoidonFileCreate(File file) {
log.info("[新建]:"+ file.getAbsolutePath());
}
/**
* 文件创建修改
*/
publicvoidonFileChange(File file) {
log.info("[修改]:"+ file.getAbsolutePath());
}
/**
* 文件删除
*/
publicvoidonFileDelete(File file) {
log.info("[删除]:"+ file.getAbsolutePath());
}
/**
* 目录创建
*/
publicvoidonDirectoryCreate(File directory) {
log.info("[新建]:"+ directory.getAbsolutePath());
}
/**
* 目录修改
*/
publicvoidonDirectoryChange(File directory) {
log.info("[修改]:"+ directory.getAbsolutePath());
}
/**
* 目录删除
*/
publicvoidonDirectoryDelete(File directory) {
log.info("[删除]:"+ directory.getAbsolutePath());
}
publicvoidonStart(FileAlterationObserver observer) {
// TODO Auto-generated method stub
super.onStart(observer);
}
publicvoidonStop(FileAlterationObserver observer) {
// TODO Auto-generated method stub
super.onStop(observer);
}
}

4、实现main方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
publicstaticvoidmain(String[] args) throwsException{
// 监控目录
String rootDir = "D:\apache-tomcat-7.0.78";
// 轮询间隔 5 秒
longinterval = TimeUnit.SECONDS.toMillis(1);
// 创建过滤器
IOFileFilter directories = FileFilterUtils.and(
FileFilterUtils.directoryFileFilter(),
HiddenFileFilter.VISIBLE);
IOFileFilter files = FileFilterUtils.and(
FileFilterUtils.fileFileFilter(),
FileFilterUtils.suffixFileFilter(".txt"));
IOFileFilter filter = FileFilterUtils.or(directories, files);
// 使用过滤器
FileAlterationObserver observer = newFileAlterationObserver(newFile(rootDir), filter);
//不使用过滤器
//FileAlterationObserver observer = new FileAlterationObserver(new File(rootDir));
observer.addListener(newFileListener());
//创建文件变化监听器
FileAlterationMonitor monitor = newFileAlterationMonitor(interval, observer);
// 开始监控
monitor.start();
}

二、使用JDK7提供的WatchService

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
publicstaticvoidmain(String[] a) {
finalPath path = Paths.get("D:\apache-tomcat-7.0.78");
try(WatchService watchService = FileSystems.getDefault().newWatchService()) {
//给path路径加上文件观察服务
path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_MODIFY,
StandardWatchEventKinds.ENTRY_DELETE);
while(true) {
finalWatchKey key = watchService.take();
for(WatchEvent<?> watchEvent : key.pollEvents()) {
finalWatchEvent.Kind<?> kind = watchEvent.kind();
if(kind == StandardWatchEventKinds.OVERFLOW) {
continue;
}
//创建事件
if(kind == StandardWatchEventKinds.ENTRY_CREATE) {
System.out.println("[新建]");
}
//修改事件
if(kind == StandardWatchEventKinds.ENTRY_MODIFY) {
System.out.println("修改]");
}
//删除事件
if(kind == StandardWatchEventKinds.ENTRY_DELETE) {
System.out.println("[删除]");
}
// get the filename for the event
finalWatchEvent<Path> watchEventPath = (WatchEvent<Path>) watchEvent;
finalPath filename = watchEventPath.context();
// print it out
System.out.println(kind + " -> "+ filename);
}
booleanvalid = key.reset();
if(!valid) {
break;
}
}
} catch(IOException | InterruptedException ex) {
System.err.println(ex);
}
}

三、以上方法都可以实现对相应文件夹得文件监控,但是在使用jdk7提供的API时,会出现些许问题。

  • (1)当文件修改时,会被调用两次,即输出两个相同的修改。
  • (2)不能对其子文件夹进行监控,只能提示目录被修改。
  • (3)无法对文件类型进行过滤。

免责声明:文章转载自《Java实现文件夹下文件实时监控》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Win10+YOLOv3完整安装过程(亲测可运行)Java使用Scanner接收中文并输出时出现乱码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

apache配置禁止访问某些文件/目录

 我们来看俩段通常对上传目录设置无权限的列子,配置如下: 代码如下: ? 1 2 3 4 5 6 <Directory "/var/www/upload"> <FilesMatch ".php"> Order Allow,Deny Deny from all </FilesMatch> </Dir...

nginx server 实时监控

本文建立在Centos基础上,也可应用在其他版本的linux上。适合使用nginx为反向代理的java开发人员。写本文的原因是nginx在apache下面也有 一些监控的工具,不过大部分都是基于php的。java开发者可能不愿意再去配置php环境的apache,本文提供了一种简易专业的nginx监控方 法,比较适合小型应用(server number&l...

Lucene 全文检索引擎

Apache Lucene PS: 苦学一周全文检索,由原来的搜索小白,到初次涉猎,感觉每门技术都博大精深,其中精髓亦是不可一日而语。那小博猪就简单介绍一下这一周的学习历程, 仅供各位程序猿们参考,这其中不涉及任何私密话题,因此也不用打马赛克了,都是网络分享的开源资料,当然也不涉及任何利益关系。 Lucene是apache软件基金会4 jakarta项目...

汇编语言程序入门实验二:在dos下建立子目录操作

汇编语言程序入门实验二:在dos下建立子目录操作 1,背景     在读此文,并读懂前,建议读者先阅读这两篇博客 1,在dos环境下汇编语言程序设计入门(输出hello world)和masm32的下载、安装与使用。详情请见链接:http://blog.csdn.net/u010043538/article/details/12720447。 2,汇编语言...

wampserver2.5 在 Win7 64位下的相关配置备忘

发现运行和配置这个版本和之前的Wampserver有些差异,特此记录 1).wampserver2.5-Apache-2.4.9-Mysql-5.6.17-php5.5.12-64b,另外有可能需要安装 Visual C++ 2012 Reditributable_64.11.exe,请根据提示操作 2).apache端口修改配置文件位置 D:wamp64...

Oracle 11g数据库创建表空间、用户、目录、以及给用户授权

以下操作皆是Windows下操作: 一、创建表空间 创建表空间,是管理员级别的操作,当你装了一个数据库,这个数据库的表空间可以不止一个,可以根据实际情况来对应的增加、创建 打开命令提示符的窗口:可以直接Windows键+R,也可以如下图所示打开,用管理员身份登录sqlplus ,登录成功之后就可以输入以下命令: create tablespace MYSP...