リアルタイム監視ファイルフォルダのJava実装

、コモンズ-IO方法

図1は、プロセスモニタがファイルを監視することができコモンズの-IOに関連するクラスを使用して、それが達成さオブザーバーパターンを使用します

  • (1)フォルダの作成、削除、変更を監視することができます
  • (2)作成、変更、削除されたファイルを監視することができます
  • (3)オブザーバーパターンが達成される使用
  • (4)スレッドのリフレッシュのタイミングは、文書内の変化を検出します

2、コモンズ-IOパッケージの導入は、2.0以上が必要です。

1
2
3
4
5
6
< dependency >
   < groupId >commons-io</ groupId >
   < artifactId >commons-io</ artifactId >
   < version >2.6</ version >
</ dependency >

3、書き込みクラスがFileListenerのFileAlterationListenerAdaptorを継承します。

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时,会出现些许问题。

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

おすすめ

転載: www.cnblogs.com/Soy-technology/p/11779262.html