Java實現文件夾下文件實時監控

1、commons-io方法java

一、使用Commons-io的monitor下的相關類能夠處理對文件進行監控,它採用的是觀察者模式來實現的apache

  • (1)能夠監控文件夾的建立、刪除和修改
  • (2)能夠監控文件的建立、刪除和修改
  • (3)採用的是觀察者模式來實現的
  • (4)採用線程去定時去刷新檢測文件的變化狀況

二、引入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

  • (1)當文件修改時,會被調用兩次,即輸出兩個相同的修改。
  • (2)不能對其子文件夾進行監控,只能提示目錄被修改。
  • (3)沒法對文件類型進行過濾。
相關文章
相關標籤/搜索