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)无法对文件类型进行过滤。