当前位置:   article > 正文

java进阶(三) 用单例模式加载配置文件_java仅初始化加载一次配置文件

java仅初始化加载一次配置文件

在实际开发中,经常需要加载配置文件,在读取配置文件的过程中,我们只需要初始化一次即可。就想到了用单例模式来加载配置文件,最常用的单例模式有四种:懒汉式(线程安全,延迟加载,线程阻塞),饿汉式(线程安全,不会延迟加载,响应迅速),匿名内部类(线程安全,延迟加载,响应迅速),枚举。


综合考虑,使用匿名内部类的方式加载配置文件(根据自己的业务场景,挑选)比较好。

当时用getXXXByKey()方法后,会自动扫描和XXX.properties同级目录下的所有properties文件,文件编码以调用此方法的编码为准(默认UTF-8),例如:调用getStringByKey("mysql.properties", "mysql.url","UTF-8"),在第一次调用时会自动扫描和mysql.properties同级目录下的所有properties文件,使用UTF-8编码解析文件,然后返回mysql.properties文件中mysql.url所对应的value值。

以下是实现方式:

  1. public class PropertiesUtil {
  2. /**
  3. * 私有化构造函数,防止类被实例化
  4. * @date 2017年3月9日
  5. */
  6. private PropertiesUtil(String filePath, String encode) {
  7. File file = new File(filePath);
  8. File[] array = file.listFiles();
  9. for(File childfile : array) {
  10. String childFileName = childfile.getName();
  11. if(!childFileName.endsWith("properties")) continue;
  12. loadConfigProperties(childFileName, encode);
  13. }
  14. }
  15. /**
  16. * 存放配置文件的所有的key-value
  17. * 以这种方式存储是为了防止多个配置文件间存在key冲突
  18. */
  19. private Map<String, HashMap<String,String>> allParam = new HashMap<String, HashMap<String, String>>();
  20. /**
  21. * 默认的properties文件名
  22. */
  23. private static final String DEFAULT_PROPERTIES_NAME = "config.properties";
  24. /**
  25. * 解析properties文件默认编码
  26. */
  27. private static final String DEFAULT_ENCODE = "UTF-8";
  28. /**
  29. * 解析properties文件编码
  30. */
  31. private static String fileEncode = null;
  32. /**
  33. * properties文件所在的地址
  34. */
  35. private static String propertiesParentPath = null;
  36. /**
  37. * 根据文件名称-key,返回相应key的值
  38. * 文件名默认为config.properties,文件编码默认为UTF-8
  39. * @date 2016年11月7日
  40. */
  41. public static Integer getIntegerByKey(String key) {
  42. return Integer.parseInt(getStringByKey(DEFAULT_PROPERTIES_NAME, key, DEFAULT_ENCODE));
  43. }
  44. /**
  45. * 根据文件名称-key,返回相应key的值,文件编码默认为UTF-8
  46. * @param fileName 文件名
  47. * @param key properties文件中key的名称
  48. * @date 2017年3月9日
  49. */
  50. public static Integer getIntegerByKey(String fileName, String key) {
  51. return Integer.parseInt(getStringByKey(fileName, key, DEFAULT_ENCODE));
  52. }
  53. /**
  54. * 根据文件名称-key,返回相应key的值
  55. * @param fileName 文件名
  56. * @param key properties文件中key的名称
  57. * @param encode 文件编码
  58. * @date 2017年3月9日
  59. */
  60. public static Integer getIntegerByKey(String fileName, String key, String encode) {
  61. return Integer.parseInt(getStringByKey(fileName, key, encode));
  62. }
  63. /**
  64. * 根据文件名称-key,返回相应key的值
  65. * 文件名默认为config.properties,文件编码默认为UTF-8
  66. * @date 2016年11月7日
  67. */
  68. public static Boolean getBooleanByKey(String key) {
  69. return Boolean.parseBoolean(getStringByKey(DEFAULT_PROPERTIES_NAME, key, DEFAULT_ENCODE));
  70. }
  71. /**
  72. * 根据文件名称-key,返回相应key的值,文件编码默认为UTF-8
  73. * @param fileName 文件名
  74. * @param key properties文件中key的名称
  75. * @date 2017年3月9日
  76. */
  77. public static Boolean getBooleanByKey(String fileName, String key) {
  78. return Boolean.parseBoolean(getStringByKey(fileName, key, DEFAULT_ENCODE));
  79. }
  80. /**
  81. * 根据文件名称-key,返回相应key的值
  82. * @param fileName 文件名
  83. * @param key properties文件中key的名称
  84. * @param encode 文件编码
  85. * @date 2017年3月9日
  86. */
  87. public static Boolean getBooleanByKey(String fileName, String key, String encode) {
  88. return Boolean.parseBoolean(getStringByKey(fileName, key, encode));
  89. }
  90. /**
  91. * 根据文件名称-key,返回相应key的值
  92. * 文件名默认为config.properties,文件编码默认为UTF-8
  93. * @date 2016年11月7日
  94. */
  95. public static Long getLongByKey(String key) {
  96. return Long.parseLong(getStringByKey(DEFAULT_PROPERTIES_NAME, key, DEFAULT_ENCODE));
  97. }
  98. /**
  99. * 根据文件名称-key,返回相应key的值,文件编码默认为UTF-8
  100. * @param fileName 文件名
  101. * @param key properties文件中key的名称
  102. * @date 2017年3月9日
  103. */
  104. public static Long getLongByKey(String fileName, String key) {
  105. return Long.parseLong(getStringByKey(fileName, key, DEFAULT_ENCODE));
  106. }
  107. /**
  108. * 根据文件名称-key,返回相应key的值
  109. * @param fileName 文件名
  110. * @param key properties文件中key的名称
  111. * @param encode 文件编码
  112. * @date 2017年3月9日
  113. */
  114. public static Long getLongByKey(String fileName, String key, String encode) {
  115. return Long.parseLong(getStringByKey(fileName, key, encode));
  116. }
  117. /**
  118. * 根据文件名称-key,返回相应key的值
  119. * 文件名默认为config.properties,文件编码默认为UTF-8
  120. * @date 2016年11月7日
  121. */
  122. public static String getStringByKey(String key){
  123. return getStringByKey(DEFAULT_PROPERTIES_NAME, key, DEFAULT_ENCODE);
  124. }
  125. /**
  126. * 根据文件名,key返回value值,文件编码默认为UTF-8
  127. * @date 2016年11月7日
  128. */
  129. public static String getStringByKey(String fileName, String key) {
  130. return getStringByKey(fileName, key, DEFAULT_ENCODE);
  131. }
  132. /**
  133. * 根据文件名,key,编码返回value值
  134. * @date 2016年11月7日
  135. */
  136. public static String getStringByKey(String fileName, String key, String encode) {
  137. String propertiesPath = PropertiesUtil.class.getClassLoader()
  138. .getResource(fileName).getPath().replace(fileName, "");
  139. propertiesParentPath = propertiesPath;
  140. fileEncode = encode;
  141. return PropertiesUtilHolder.instance.allParam.get(fileName).get(key);
  142. }
  143. /**
  144. * 静态内部类,单例模式,保证只有一个实例变量
  145. * @date 2017年5月16日
  146. */
  147. private static class PropertiesUtilHolder {
  148. private static PropertiesUtil instance = new PropertiesUtil(propertiesParentPath, fileEncode);
  149. }
  150. /**
  151. * 加载配置文件,需要进行加锁
  152. * @date 2017年5月3日
  153. */
  154. private void loadConfigProperties(String fileName, String encode) {
  155. InputStream in = null;
  156. try {
  157. Properties p = new Properties();
  158. File file = new File(fileName);
  159. if(file.exists()) {
  160. p.load(new FileInputStream(file));
  161. } else {
  162. in = PropertiesUtil.class.getClassLoader().getResourceAsStream(fileName);
  163. // 解决中文乱码
  164. BufferedReader bf = new BufferedReader(new InputStreamReader(in, encode));
  165. p.load(bf);
  166. }
  167. Set<Entry<Object, Object>> allKey = p.entrySet();
  168. HashMap<String, String> paramMap = new HashMap<String, String>();
  169. for (Entry<Object, Object> entry : allKey) {
  170. paramMap.put(String.valueOf(entry.getKey()), String.valueOf(entry.getValue()));
  171. }
  172. allParam.put(fileName, paramMap);
  173. } catch (IOException e) {
  174. e.printStackTrace();
  175. } finally {
  176. try {
  177. if(in != null) in.close();
  178. } catch (IOException e) {
  179. e.printStackTrace();
  180. }
  181. }
  182. }
  183. }



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/157741
推荐阅读
相关标签
  

闽ICP备14008679号