--- tags: tirc-library --- # JsonFileConfig ### maven ```xml= <dependency> <groupId>tirc.lib</groupId> <artifactId>json_file_config</artifactId> <version>1.0.0</version> </dependency> ``` 目前版本與OOError專案相依 https://hackmd.io/@tirc/ryvdhgzJP ## 主要目的 * 提供以Json格式將參數檔寫入與讀取的功能 * 提供從jar檔中直接讀取參數檔功能 * 提供檔案加解密功能 ## 主要元件 ### JsonFileManager 主要用來將物件以json的格式存成檔案, 以及從檔案回復成物件等功能 (如果顯示異常可將code貼到mermaid online editor觀看) ```mermaid classDiagram class JsonFileManager{ +save(String fileName, Object o) BaseErr +save(String path, String fileName, Object o) BaseErr +save(Object o, OutputStream outputStream) BaseErr +saveWithCipherKey(String fileName, String cipherKey, Object o) BaseErr +readWithCipherKey(String fileName, String cipherKey, Class~T~ type) Result~T~ +read(String fileName, Class~T~ type) Result~T~ +readORCopyDefault(String fileName, String defaultName, Class~T~ type) Result~T~ +readFromResource(String fileName, Class~T~ type) Result~T~ +readFromString(String content, Class~T~ type) Result~T~ } ``` ### BaseJsonConfig 可將欲存成Json的物件繼承此類別, 其中提供了一些複制、重載、列印成字串等方法 ```mermaid classDiagram class BasicJsonConfig { +reload(String str) Result~? extends BasicJsonConfig~ +copy(BasicJsonConfig config) +toString() String } ``` ### 讀寫Json檔案 ### 使用JsonFileManager物件進行Json檔案讀取 ```java= /** 讀取檔案 * @param fileName 檔案名稱 * @param valueType Json檔案類別 * @return 回傳Json物件,或者是讀取錯誤 */ <T> Result<T> read(String fileName, Class<T> valueType) /** 儲存檔案 * @param fileName 檔案名稱 * @param object Json物件 * @return 若有錯誤則回傳 */ BaseErr save(String fileName, Object object) /** 儲存檔案,自動產生資料檔 * @param path 檔案路徑,若不存在則自動產生 * @param fileName 檔案名稱 * @param object Json物件 * @return 若有錯誤則回傳 */ public static BaseErr save(String path, String fileName, Object object) /** 讀取檔案,若發現不存在則讀取default檔案 * @param fileName 目標讀取檔案 * @param defaultName default檔案 * @param valueType 讀取的類別 * @return 回傳Json物件,或者是讀取錯誤 */ <T> Result<T> readORCopyDefault(String fileName, String defaultName, Class<T> valueType) /** 讀取resource中的檔案,目前使用來讀取jar檔中的內容 * @param fileName 目標讀取檔案 * @param valueType 讀取的類別 * @return 回傳Json物件,或者是讀取錯誤 */ <T> Result<T> readFromResource(String fileName, Class<T> valueType) ``` ### 使用Json檔案輔助格式範例 ### 在繼承BasicJsonConfig類別後,即可使用 copy, reload, toString 等基本功能。 下列為MMA1_A1的部份參數參數檔 ```java= import java.io.File; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import tirc.lib.err.ret.Result; import tirc.lib.json.BasicJsonConfig; import tirc.lib.json.JsonFileManager; @JsonIgnoreProperties(ignoreUnknown=true) public class Settings extends BasicJsonConfig { //儲存檔案的位置與名稱 public final static String FILE_NAME = "settings.json"; public final static String FILE_PATH = System.getenv("PUBLIC") + File.separator + "MMA1_A1"; public final static String FILE_NAME_WITH_PATH = FILE_PATH + File.separator + FILE_NAME; public final static int REQUIRE_FILE_VERSION = 1; protected Settings(){} private static Settings instance = null; public static Settings getInstance(){ if(instance == null){ Result<Settings> ret = JsonFileManager.read(FILE_NAME_WITH_PATH, Settings.class); if(!ret.isSuccess()) { System.out.println("Read file fail! reason:" + ret.getErrToString()); createInstanceAndSave(); } else { if(REQUIRE_FILE_VERSION != ret.getData().ver) { System.out.printf("Found different version json file! override it! expect: %d read: %d\n", REQUIRE_FILE_VERSION, ret.getData().ver); createInstanceAndSave(); }else instance = ret.getData(); } } return instance; } private static void createInstanceAndSave() { instance = new Settings(); instance.setVer( REQUIRE_FILE_VERSION ); JsonFileManager.save(FILE_PATH, FILE_NAME, instance); } @JsonIgnore public Result<? extends BasicJsonConfig> onFileChange() { Result ret = super.onFileChange(); System.out.println("onFileChange: " + toString()); return ret; } public Result<?> reload(){ return reload(FILE_NAME_WITH_PATH); } public void save() { JsonFileManager.save(FILE_PATH, FILE_NAME, instance); } @JsonIgnore public String getWatchFileName() { return FILE_NAME; } @JsonIgnore public String getWatchFileFullPath() { return FILE_NAME_WITH_PATH; } //這邊放需要記錄的參數,記得產生getter與setter private int liquefactionTubeQrcodeReaderPort=2112; private String plc1Ip="simulator"; public int getLiquefactionTubeQrcodeReaderPort() { return liquefactionTubeQrcodeReaderPort; } public void setLiquefactionTubeQrcodeReaderPort(int liquefactionTubeQrcodeReaderPort) { this.liquefactionTubeQrcodeReaderPort = liquefactionTubeQrcodeReaderPort; } public String getPlc1Ip() { return plc1Ip; } public void setPlc1Ip(String plc1Ip) { this.plc1Ip = plc1Ip; } } ``` 使用參數檔案功能 ```java= Settings.getInstance(); ``` ### 檔案監控 ### 在檔案發生修改時觸發原檔案更新,輸入的BasicJsonConfig物件需複寫下列方法,才能自動提供檔案監控機制。 * getWatchFileName方法:以提供欲監控檔案名稱。 * getWatchFileFullPath方法:以提供完整路徑,用來reload檔案。 ```java= FileWatcher fw = new FileWatcher(); fw.setWatchFolder("."); fw.addWatchFile( basicJsonConfig ); fw.init(); ``` 客製化檔案修改發生時事件範例 ```java= FileWatcher fw = new FileWatcher(); fw.setWatchFolder("."); fw.addWatchFile( file_name , new IFileWatchListener() { public void onNotify(Kind<?> kind, String fileName) { if(kind == StandardWatchEventKinds.ENTRY_MODIFY) { // put your code here } } }); fw.init(); ``` 程式結束時記得呼叫 ```java= fw.deinit(); ``` ## Release Note ## ### v1.0.0 Release date: 2021.2.2 ### * 移除test_tool相依性,將測項移至LibraryTestReportProject ### v0.0.4 Release date: 2020.3.16 ### * 更新test_tool版本至v0.2 * 建置程式時加入原始碼 ### v0.0.3 Release date: 2019.10.16 ### * 重要修正:存檔時強制更改為UTF-8 ### v0.0.2 Release date: 2018.8.29 ### * 增加加密檔案讀取與儲存功能 ### v0.0.1 Release date: 2018.4.24 ### * 支援將物件以json格存儲存與讀取 * 支援若使用者參數檔不存在,則程式開啟時自動複製Default參數檔功能 * 支援修改檔案時即時更新記憶體中物件 * 支援讀取jar檔中唯讀型態之檔案格式 * 可自動列印與複製物件內所有變數