之前用jdk7的WatchService API(java.nio.file包)来做目录下的子文件监控,后改为使用commons-io包。主要有下面几点不同:1. WatchService是采用扫描式的,效率低,commons-io是使用事件驱动的,效率高;2. WatchService代码写起来费劲 3. WatchService不能监听到孙文件目录(多级目录),事先父文件夹需要存在,而FileAlterationObserver可以监听多级目录,父目录事先不存在也没问题。http://commons.apache.org/proper/commons-io/,
commons-io功能介绍:
1) 工具类 FilenameUtils
2) FileMonitor工具类包,监听该文件及文件夹变化
3)filters过滤器 org.apache.commons.io.filefilter
4) Comparators org.apache.commons.io.comparator包下的工具类,可以方便进行文件的比较
5) input/output包 common io的org.apache.commons.io.input / org.apache.commons.io.output 包,其中好特别的是TeeOutputStream能将一个输入流分别输出到两个输出流
commons-io-2.3.jar 中,有实现文件监控的类,在org.apache.commons.io.monitor包下,
主要包括 observer ,listener,monitor 含义你懂得滴,典型观察者模式,直接上代码:
listener:
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
58
59
60
61
62
63
64
|
/*
* Version 1.0.0
* Created on 2017年12月23日
* Copyright ReYo.Cn
*/
package
reyo.sdk.utils.test.file;
import
java.io.File;
import
org.apache.commons.io.monitor.FileAlterationListener;
import
org.apache.commons.io.monitor.FileAlterationObserver;
/**
* <B>创 建 人:</B>AdministratorReyoAut <BR>
* <B>创建时间:</B>2017年12月23日 下午9:25:21<BR>
*
* @author ReYo
* @version 1.0
*/
public
class
ReYoFileListener
implements
FileAlterationListener {
ReYoFileMonitor monitor =
null
;
@Override
public
void
onStart(FileAlterationObserver observer) {
//System.out.println("onStart");
}
@Override
public
void
onDirectoryCreate(File directory) {
System.out.println(
"onDirectoryCreate:"
+ directory.getName());
}
@Override
public
void
onDirectoryChange(File directory) {
System.out.println(
"onDirectoryChange:"
+ directory.getName());
}
@Override
public
void
onDirectoryDelete(File directory) {
System.out.println(
"onDirectoryDelete:"
+ directory.getName());
}
@Override
public
void
onFileCreate(File file) {
System.out.println(
"onFileCreate:"
+ file.getName());
}
@Override
public
void
onFileChange(File file) {
System.out.println(
"onFileCreate : "
+ file.getName());
}
@Override
public
void
onFileDelete(File file) {
System.out.println(
"onFileDelete :"
+ file.getName());
}
@Override
public
void
onStop(FileAlterationObserver observer) {
//System.out.println("onStop");
}
}
|
monitor
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
|
/*
* Version 1.0.0
* Created on 2017年12月23日
* Copyright ReYo.Cn
*/
package
reyo.sdk.utils.test.file;
import
java.io.File;
import
org.apache.commons.io.monitor.FileAlterationListener;
import
org.apache.commons.io.monitor.FileAlterationMonitor;
import
org.apache.commons.io.monitor.FileAlterationObserver;
/**
* <B>创 建 人:</B>AdministratorReyoAut <BR>
* <B>创建时间:</B>2017年12月23日 下午9:26:08<BR>
*
* @author ReYo
* @version 1.0
*/
public
class
ReYoFileMonitor {
FileAlterationMonitor monitor =
null
;
public
ReYoFileMonitor(
long
interval)
throws
Exception {
monitor =
new
FileAlterationMonitor(interval);
}
public
void
monitor(String path, FileAlterationListener listener) {
FileAlterationObserver observer =
new
FileAlterationObserver(
new
File(path));
monitor.addObserver(observer);
observer.addListener(listener);
}
public
void
stop()
throws
Exception {
monitor.stop();
}
public
void
start()
throws
Exception {
monitor.start();
}
public
static
void
main(String[] args)
throws
Exception {
ReYoFileMonitor m =
new
ReYoFileMonitor(
5000
);
m.monitor(
"D:\\temp"
,
new
ReYoFileListener());
m.start();
}
}
|
启动后,每5秒扫描指定路径下文件的变化