package com; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.naming.InitialContext; import java.io.File; import java.io.FileFilter; import java.io.FileReader; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; /** * 读取配置文件 */ public class ReadProperty { private static final Logger logger = LoggerFactory.getLogger(Globals.class); private static String confHome = null; //并发,线程安全的map private static Map<String, String> confProperties = new ConcurrentHashMap<>(); private static Map<String, File> confFiles = new ConcurrentHashMap<>(); //加载成功 private static boolean loadingSuccess = true; /** * 加载配置文件 */ private synchronized static void loadProperties() { //如果没有加载成功,返回 if ( !loadingSuccess ) { return; } //如果加载的文件是空的 if (confProperties.isEmpty()) { //如果电脑环境变量中为空 if (confHome == null) { confHome = System.getProperty("CONF_HOME"); } //如果web.xml中没配 if (confHome == null) { try { InitialContext context = new InitialContext(); confHome = (String)context.lookup("java:comp/env/CONF_HOME"); } catch(Exception e) { logger.warn("Can not find jini name {}", "java:comp/env/CONF_HOME"); } } //如果还是为空,就找本机路径下的ProtectionDomain/CodeSource/Location/getFile/WEB-INF/文件夹/conf if (confHome == null) { confHome = (new InitWebPath()).getRootPath() + "WEB-INF" + File.separator + "conf"; } //是否是文件夹 try { File dirFile = new File(confHome); if(!dirFile.exists() || (!dirFile.isDirectory())){ logger.warn("Can not find home or is not directory! {}", confHome); loadingSuccess = false; return; } //获取所有文件后缀是.properties的文件名 File[] files = dirFile.listFiles(new FileFilter() { @Override public boolean accept(File file) { String fileName = file.getName(); int pos = fileName.lastIndexOf(".properties");//最后一个匹配的 db.xml和db.xml.xml if (pos != -1) { confFiles.put(fileName.substring(0, pos), file);//文件名与文件关联 key value return true; } else { pos = fileName.lastIndexOf(".xml"); confFiles.put(fileName.substring(0, pos), file); return false; } } } ); //迭代文件,读取key value for(File file : files) { Properties fileProperties = new Properties(); fileProperties.load(new FileReader(file)); Iterator<Entry<Object, Object>> iterProp = fileProperties.entrySet().iterator(); while(iterProp.hasNext()) { Entry<Object, Object> row = iterProp.next(); Object key = row.getKey(); Object value = row.getValue(); if (null!=key && null!=value) { confProperties.put(key.toString(), value.toString()); } } } } catch(Exception e) { loadingSuccess = false; } } } /** * 读取配置文件信息 * @param name key * @return value */ public static String getProperty(String name) { if (confProperties.isEmpty()) { loadProperties(); } return confProperties.get(name); } static class InitWebPath{ public String getRootPath() { String url = InitWebPath.class.getProtectionDomain().getCodeSource().getLocation().getFile(); String filePath = ""; try { filePath = java.net.URLDecoder.decode(url, "utf-8"); } catch (Exception e) { logger.error(e.getMessage(), e); } final String fileFlag = "file:"; if (filePath.startsWith(fileFlag)) { filePath = filePath.substring(fileFlag.length()); } final String applicationFlag = "WEB-INF"; return filePath.substring(0, filePath.lastIndexOf(applicationFlag)); } } }