1、commons-io方法java
一、使用Commons-io的monitor下的相关类能够处理对文件进行监控,它采用的是观察者模式来实现的apache
二、引入commons-io包,须要2.0以上。tomcat
1
2
3
4
5
6
|
<
dependency
>
<
groupId
>commons-io</
groupId
>
<
artifactId
>commons-io</
artifactId
>
<
version
>2.6</
version
>
</
dependency
>
|
三、编写继承FileAlterationListenerAdaptor的类FileListener。spa
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
|
import
java.io.File;
import
org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import
org.apache.commons.io.monitor.FileAlterationObserver;
import
org.apache.log4j.Logger;
/**
* 文件变化监听器
* 在Apache的Commons-IO中有关于文件的监控功能的代码. 文件监控的原理以下:
* 由文件监控类FileAlterationMonitor中的线程不停的扫描文件观察器FileAlterationObserver,
* 若是有文件的变化,则根据相关的文件比较器,判断文件时新增,仍是删除,仍是更改。(默认为1000毫秒执行一次扫描)
*/
public
class
FileListener
extends
FileAlterationListenerAdaptor {
private
Logger log = Logger.getLogger(FileListener.
class
);
/**
* 文件建立执行
*/
public
void
onFileCreate(File file) {
log.info(
"[新建]:"
+ file.getAbsolutePath());
}
/**
* 文件建立修改
*/
public
void
onFileChange(File file) {
log.info(
"[修改]:"
+ file.getAbsolutePath());
}
/**
* 文件删除
*/
public
void
onFileDelete(File file) {
log.info(
"[删除]:"
+ file.getAbsolutePath());
}
/**
* 目录建立
*/
public
void
onDirectoryCreate(File directory) {
log.info(
"[新建]:"
+ directory.getAbsolutePath());
}
/**
* 目录修改
*/
public
void
onDirectoryChange(File directory) {
log.info(
"[修改]:"
+ directory.getAbsolutePath());
}
/**
* 目录删除
*/
public
void
onDirectoryDelete(File directory) {
log.info(
"[删除]:"
+ directory.getAbsolutePath());
}
public
void
onStart(FileAlterationObserver observer) {
// TODO Auto-generated method stub
super
.onStart(observer);
}
public
void
onStop(FileAlterationObserver observer) {
// TODO Auto-generated method stub
super
.onStop(observer);
}
}
|
四、实现main方法.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public
static
void
main(String[] args)
throws
Exception{
// 监控目录
String rootDir =
"D:\\apache-tomcat-7.0.78"
;
// 轮询间隔 5 秒
long
interval = 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 =
new
FileAlterationObserver(
new
File(rootDir), filter);
//不使用过滤器
//FileAlterationObserver observer = new FileAlterationObserver(new File(rootDir));
observer.addListener(
new
FileListener());
//建立文件变化监听器
FileAlterationMonitor monitor =
new
FileAlterationMonitor(interval, observer);
// 开始监控
monitor.start();
}
|
2、使用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
|
public
static
void
main(String[] a) {
final
Path 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
) {
final
WatchKey key = watchService.take();
for
(WatchEvent<?> watchEvent : key.pollEvents()) {
final
WatchEvent.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
final
WatchEvent<Path> watchEventPath = (WatchEvent<Path>) watchEvent;
final
Path filename = watchEventPath.context();
// print it out
System.out.println(kind +
" -> "
+ filename);
}
boolean
valid = key.reset();
if
(!valid) {
break
;
}
}
}
catch
(IOException | InterruptedException ex) {
System.err.println(ex);
}
}
|
3、以上方法均可以实现对相应文件夹得文件监控,可是在使用jdk7提供的API时,会出现些许问题。code