最近搞一個簡單的Demo項目的時候,須要讀取Properties文件中的配置信息,不想一個個文件寫代碼讀取,也不想引入其它龐大的框架來進行自動掃描讀取,就本身寫了一個簡單的自動掃描class目錄下全部properties文件中的配置信息的工具。java
JDK版本爲1.8.git
PropertiesContext類是一個單例,持有全部讀取出來的配置信息,經過該對象的方法拿到所須要的配置信息。併發
package org.cent.tools.properties_reader.context; import org.cent.tools.properties_reader.util.PropertiesReader; import java.util.Properties; /** * 配置信息上下文 * Created by cent on 2016/10/24. */ public enum PropertiesContext { /** * 枚舉實現單例模式 */ INSTANCE; /** * 讀取到的配置信息(內存) */ private Properties properties; /** * 初始化讀取配置 */ { PropertiesReader reader=new PropertiesReader(); properties= reader.readAllProperties(); } /** * 根據key獲取配置值 * @param key * @return */ public String getProperty(String key) { return (String) properties.get(key); } /** * 根據key獲取配置值,若是配置值爲null,則返回默認值 * @param key * @param defaultVal 默認值 * @return */ public String getPropertyOrDefault(String key, String defaultVal) { return properties.get(key) == null ? (String) properties.get(key) : defaultVal; } /** * 是否包含該key的配置 * @param key * @return */ public boolean containsKey(String key){ return properties.containsKey(key); } }
該類封裝了配置文件讀取的入口方法,其中:readAllProperties()方法爲讀取class目錄下全部配置文件;readProperties(File path)爲讀取指定路徑下的全部配置文件。app
package org.cent.tools.properties_reader.util; import java.io.File; import java.util.Properties; /** * Created by cent on 2016/10/24. */ public class PropertiesReader { /** * 讀取全部目錄配置文件 * @return */ public Properties readAllProperties(){ //獲取class根目錄 File root=new File(this.getClass().getClassLoader().getResource("").getFile()); return readProperties(root); } /** * 讀取指定目錄配置文件 * @param path 指定目錄 * @return */ public Properties readProperties(File path){ return PropertiesFileUtil.recursiveFile(path, PropertiesFileUtil::checkAndReadProperties); } }
遞歸讀取文件目錄下的Properties文件,並存儲到Properties對象中返回。框架
package org.cent.tools.properties_reader.util; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Arrays; import java.util.Properties; import java.util.function.Function; /** * 配置文件工具類 * Created by cent on 2016/10/24. */ public abstract class PropertiesFileUtil { /** * 配置文件後綴名常量 */ private static final String PROPERTIES_SUFFIX=".properties"; /** * 遞歸各個文件夾讀取配置文件,若是是文件執行回調函數 * @param root 根目錄 * @param isFileThenDoFunction 若是是文件,則執行該回調函數 * @return */ public static Properties recursiveFile(File root, Function<File,Properties> isFileThenDoFunction){ Properties properties=new Properties(); if(root.exists()) { File[] files = root.listFiles(); //併發流讀取properties文件 Arrays.asList(files).parallelStream().forEach(file -> { if(file.isFile()){ properties.putAll(isFileThenDoFunction.apply(file)); }else{ properties.putAll(recursiveFile(file,isFileThenDoFunction)); } }); } return properties; } /** * 判斷是否配置文件,是則讀取出來並返回 * @param file 需讀取的文件 * @return */ public static Properties checkAndReadProperties(File file){ String suffix=file.getName().substring(file.getName().lastIndexOf("."),file.getName().length()); if(PROPERTIES_SUFFIX.equals(suffix)){ Properties properties=new Properties(); try { properties.load(new FileInputStream(file)); return properties; } catch (IOException e) { e.printStackTrace(); } } return new Properties(); } }
阿里Code源碼地址:https://code.aliyun.com/cent/properties-reader.git函數