Java使用WatchService監(jiān)控文件內(nèi)容變化的示例
更新時間:2017年10月20日 10:29:28 作者:Chown
本篇文章主要介紹了Java使用WatchService監(jiān)控文件變化的示例,非常具有實用價值,需要的朋友可以參考下
場景
系統(tǒng)實現(xiàn)中經(jīng)常需要能夠感知配置文件的變化,然后及時更新上下文。
實現(xiàn)方案
- 自己起一個單獨線程,定時加載文件,實現(xiàn)較簡單,但是無法保證能夠?qū)崟r捕捉文件變化,同時耗CPU
- 使用commons-io中的 FileAlterationObserver,思想和上面類似,對比前后文件列表的變化,觸發(fā)對應事件
- JDK 1.7提供的WatchService,利用底層文件系統(tǒng)提供的功能
使用 WatchService
WatchService用來監(jiān)控一個目錄是否發(fā)生改變,但是可以通過 WatchEvent 上下文定位具體文件的變化。具體使用過程中要注意以下兩點:
- 文件改變可能會觸發(fā)兩次事件(我的理解:文件內(nèi)容的變更,元數(shù)據(jù)的變更),可以通過文件的時間戳來控制
- 在文件變化事件發(fā)生后,如果立即讀取文件,可能所獲內(nèi)容并不完整,建議的做法判斷文件的 length > 0
// 監(jiān)控文件的變化,重新加載 executor.submit(new Runnable() { @Override public void run() { try { final Path path = FileSystems.getDefault().getPath(getMonitorDir()); System.out.println(path); final WatchService watchService = FileSystems.getDefault().newWatchService(); final WatchKey watchKey = path.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY); while (true) { final WatchKey wk = watchService.take(); for (WatchEvent<?> event : wk.pollEvents()) { final Path changed = (Path) event.context(); Path absolute = path.resolve(changed); File configFile = absolute.toFile(); long lastModified = configFile.lastModified(); logger.info(lastModified + "----------------"); // 利用文件時間戳,防止觸發(fā)兩次 if (changed.endsWith(getLicenseName()) && lastModified != LAST_MOD && configFile.length > 0) { logger.info("----------------- reloading -----------------"); LAST_MOD = lastModified; // 保存上一次時間戳 UPDATED = true; // 設置標志位 } } if (UPDATED) { reloadFile(); // 重新加載 } // reset the key boolean valid = wk.reset(); if (!valid) { logger.error("watch key invalid!"); } } } catch (Exception e) { logger.error(""); } } });
參考
Watching a Directory for Changes
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
解析Mybatis的insert方法返回數(shù)字-2147482646的解決
這篇文章主要介紹了解析Mybatis的insert方法返回數(shù)字-2147482646的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04