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
有三種監聽事件類型,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 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中判斷須要監聽的具體類型或具體某個文件。