Directory monitor

Monitor directory changes

Quartz定時器 or Timer + Thread:開啓線程定時去讀取文件內容,查看文件內容是否發生變化,但對於文件內容過大或者過於複雜的(不推薦),或者經過定時檢查文件的修改時間lastModifyTime,可是可能出現問題(不推薦),還有經過讀取文件流生成MD5對應的MD5碼,若是MD5不一樣則文件發生變化,對於大型文件也有問題,適合小文件。java

JDK watch:使用JDK 7自帶的 watch。ide

Commons-io.monitor:File Monitor - a component for monitoring file system events。ui

 

JDK watch

  有三種監聽事件類型,ENTRY_CREATE、ENTRY_DELETE、ENTRY_MODIFY。Watch只能監控目錄,而不能監聽某個具體的文件,需手動實現監聽具體的文件。若是直接監聽文件,則會報錯 NotDirectoryException。this

public static void jdkWatchDirectory() {
		// define a folder root
		Path myDir = Paths.get("D:/deploy");
		try {
			WatchService watcher = myDir.getFileSystem().newWatchService();
			myDir.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY);
			WatchKey watckKey = watcher.take();

			while (true) {
				List<WatchEvent<?>> events = watckKey.pollEvents();
				for (WatchEvent event : events)
					if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY)
						System.out.println("Modify: " + event.context().toString());
				
			}
		} catch (Exception e) {
			System.out.println("Error: " + e.toString());
		}
	}

  使用JDK Watch方式監控Directory,當文件內容發生變動時,有可能會觸發兩次MODIFY。spa

 

Commons-io Monitor

Commons-io Monitor class as follows:線程

FileAlterationListener Interface: A listener that receives events of file system modifications.code

public interface FileAlterationListener {

    /**
     * File system observer started checking event.
     *
     * @param observer The file system observer
     */
    void onStart(final FileAlterationObserver observer);

    /**
     * Directory created Event.
     * 
     * @param directory The directory created
     */
    void onDirectoryCreate(final File directory);

    /**
     * Directory changed Event.
     * 
     * @param directory The directory changed
     */
    void onDirectoryChange(final File directory);

    /**
     * Directory deleted Event.
     * 
     * @param directory The directory deleted
     */
    void onDirectoryDelete(final File directory);

    /**
     * File created Event.
     * 
     * @param file The file created
     */
    void onFileCreate(final File file);

    /**
     * File changed Event.
     * 
     * @param file The file changed
     */
    void onFileChange(final File file);

    /**
     * File deleted Event.
     * 
     * @param file The file deleted
     */
    void onFileDelete(final File file);

    /**
     * File system observer finished checking event.
     *
     * @param observer The file system observer
     */
    void onStop(final FileAlterationObserver observer);
}

 

FileAlterationListenerAdaptor:a dapter ,fileAlterationListener implementation that does nothing.rewrite required methods。component

example server

public class FileListener extends FileAlterationListenerAdaptor {
	
    @Override  
    public void onFileChange(File file) {
    	if (file.getName().contains("mail_profile.xml")) {
    		// TODO do something
    	}
        System.out.println("Modify:" + file.getAbsolutePath());  
    }  
  
    @Override  
    public void onStart(FileAlterationObserver observer) {  
        super.onStart(observer);  
    }  
  
    @Override  
    public void onStop(FileAlterationObserver observer) {  
        super.onStop(observer);  
    }  
    
    public static void main(String[] args) throws Exception{    
        String targetDirectory = "D:\\deploy";    
        long listeningInterval = TimeUnit.SECONDS.toMillis(2);  
        FileAlterationObserver observer = new FileAlterationObserver(targetDirectory);
        observer.addListener(new FileListener());    
        FileAlterationMonitor monitor = new FileAlterationMonitor(listeningInterval, observer); 
        monitor.start();    
    }  
}

Monitor directory "d:\deploy" file changes. 若是想監聽某類文件的變化,須要添加FileFilter。xml

/**
     * Construct an observer for the specified directory and file filter.
     *
     * @param directoryName the name of the directory to observe
     * @param fileFilter The file filter or null if none
     */
    public FileAlterationObserver(String directoryName, FileFilter fileFilter) {
        this(new File(directoryName), fileFilter);
    }

implementation

String targetDirectory = "D:\\deploy";       
long listeningInterval = TimeUnit.SECONDS.toMillis(2);    
IOFileFilter fileFilter = FileFilterUtils.and(
        		FileFilterUtils.fileFileFilter(),
        		FileFilterUtils.suffixFileFilter(".xml"),
                FileFilterUtils.nameFileFilter("mail_profile.xml"));
Collection<File> files = FileUtils.listFiles(new File(rootDir),fileFilter, TrueFileFilter.INSTANCE);
System.out.println(files);
FileAlterationObserver observerFilter = new FileAlterationObserver(targetDirectory, fileFilter);    
observerFilter.addListener(new FileListener());
FileAlterationMonitor monitor = new FileAlterationMonitor(listeningInterval, observerFilter );      
monitor.start();

可是FileFilter沒有生效,而且整個目錄的文件變化都未觸發事件。因此只能不加FileFilter,而且在onFileChange中判斷須要監聽的具體類型或具體某個文件。

相關文章
相關標籤/搜索