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