一、commons-io方法
1、使用Commons-io的monitor下的相关类可以处理对文件进行监控,它采用的是观察者模式来实现的
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
|
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); } } |
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
|
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(); } |
二、使用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); } } |
三、以上方法都可以实现对相应文件夹得文件监控,但是在使用jdk7提供的API时,会出现些许问题。
原文:https://www.cnblogs.com/Soy-technology/p/11779262.html