JAVA文件夹监控

一、commons-io方法
1、使用Commons-io的monitor下的相关类可以处理对文件进行监控,它采用的是观察者模式来实现的
(1)可以监控文件夹的创建、删除和修改 (2)可以监控文件的创建、删除和修改 (3)采用的是观察者模式来实现的 (4)采用线程去定时去刷新检测文件的变化情况

2、引入commons-io包,需要2.0以上。
1 <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
2 <dependency>
3     <groupId>commons-io</groupId>
4     <artifactId>commons-io</artifactId>
5     <version>2.6</version>
6 </dependency>

3、编写继承FileAlterationListenerAdaptor的类FileListener。
 1 import java.io.File;
 2 
 3 import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
 4 import org.apache.commons.io.monitor.FileAlterationObserver;
 5 import org.apache.log4j.Logger;
 6 
 7 /**
 8  * 文件变化监听器
 9  *
10  * 在Apache的Commons-IO中有关于文件的监控功能的代码. 文件监控的原理如下:
11  * 由文件监控类FileAlterationMonitor中的线程不停的扫描文件观察器FileAlterationObserver,
12  * 如果有文件的变化,则根据相关的文件比较器,判断文件时新增,还是删除,还是更改。(默认为1000毫秒执行一次扫描)
13  *
14  *
15  */
16 public class FileListener extends FileAlterationListenerAdaptor {
17     private Logger log = Logger.getLogger(FileListener.class);
18     /**
19      * 文件创建执行
20      */
21     public void onFileCreate(File file) {
22         log.info("[新建]:" + file.getAbsolutePath());
23     }
24 
25     /**
26      * 文件创建修改
27      */
28     public void onFileChange(File file) {
29         log.info("[修改]:" + file.getAbsolutePath());
30     }
31 
32     /**
33      * 文件删除
34      */
35     public void onFileDelete(File file) {
36         log.info("[删除]:" + file.getAbsolutePath());
37     }
38 
39     /**
40      * 目录创建
41      */
42     public void onDirectoryCreate(File directory) {
43         log.info("[新建]:" + directory.getAbsolutePath());
44     }
45 
46     /**
47      * 目录修改
48      */
49     public void onDirectoryChange(File directory) {
50         log.info("[修改]:" + directory.getAbsolutePath());
51     }
52 
53     /**
54      * 目录删除
55      */
56     public void onDirectoryDelete(File directory) {
57         log.info("[删除]:" + directory.getAbsolutePath());
58     }
59 
60     public void onStart(FileAlterationObserver observer) {
61         // TODO Auto-generated method stub
62         super.onStart(observer);
63     }
64 
65     public void onStop(FileAlterationObserver observer) {
66         // TODO Auto-generated method stub
67         super.onStop(observer);
68     }
69 
70 }

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

二、使用JDK7提供的WatchService
 1 public static void main(String[] a) {
 2 
 3         final Path path = Paths.get("D:\\apache-tomcat-7.0.78");
 4 
 5         try (WatchService watchService = FileSystems.getDefault().newWatchService()) {
 6             //给path路径加上文件观察服务
 7             path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
 8                     StandardWatchEventKinds.ENTRY_MODIFY,
 9                     StandardWatchEventKinds.ENTRY_DELETE);
10             while (true) {
11                 final WatchKey key = watchService.take();
12 
13                 for (WatchEvent<?> watchEvent : key.pollEvents()) {
14 
15                     final WatchEvent.Kind<?> kind = watchEvent.kind();
16 
17                     if (kind == StandardWatchEventKinds.OVERFLOW) {
18                         continue;
19                     }
20                     //创建事件
21                     if (kind == StandardWatchEventKinds.ENTRY_CREATE) {
22                         System.out.println("[新建]");
23                     }
24                     //修改事件
25                     if (kind == StandardWatchEventKinds.ENTRY_MODIFY) {
26                         System.out.println("修改]");
27                     }
28                     //删除事件
29                     if (kind == StandardWatchEventKinds.ENTRY_DELETE) {
30                         System.out.println("[删除]");
31                     }
32                     // get the filename for the event
33                     final WatchEvent<Path> watchEventPath = (WatchEvent<Path>) watchEvent;
34                     final Path filename = watchEventPath.context();
35                     // print it out
36                     System.out.println(kind + " -> " + filename);
37 
38                 }
39                 boolean valid = key.reset();
40                 if (!valid) {
41                     break;
42                 }
43             }
44 
45         } catch (IOException | InterruptedException ex) {
46             System.err.println(ex);
47         }
48 
49     }
三、以上方法都可以实现对相应文件夹得文件监控,但是在使用jdk7提供的API时,会出现些许问题。

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

posted @ 2021-04-29 14:57  反转苹果派  阅读(345)  评论(0编辑  收藏  举报