在專案中,我們經常將設定檔寫為xml格式,並在properties檔案裡,給出xml檔案路徑。
對於properties檔案讀取,這裡給出propertyUtil工具類別。
在這之前,請注意:Java 的Properties 載入屬性檔案後面是無法保證輸出的順序與檔案中一致的,因為Properties 是繼承自Hashtable 的, key/value 都是直接存在Hashtable 中的,而Hashtable 是不保證進出順序的。
解決方法:繼承java.util.Properties類,用LinkedHashSet 來保存它的所有 key。
OrderedProperties類別如下
package com.test;import java.util.Collections;import java.util.Enumeration;import java.util.LinkedHashSet;import java.util.Properties;import java.util.Set;public class OrderedProperties extends Properties{private static final long serialVersionUID = 1L; private final LinkedHashSet<Object> keys = new LinkedHashSet<Object>(); public Enumeration<Object> keys() { return Collections.<Object> enumeration(keys); } public Object put(Object key, Object value) { keys.add(key); return super.put(key, value); } public Set<Object> keySet() { return keys; } public Set<String> stringPropertyNames() { Set<String> set = new LinkedHashSet<String>(); for (Object key : this.keys) { set.add((String) key); } return set; } }
讀取設定檔properties並解析xml的main方法:
package com.test;public class T {public static void main(String[] args) {// 加载properties文件propertityUtil pu = propertityUtil.getInstance("project-config.properties");// 得到业务配置文件的路径String WorkConfigureFile = pu.getProperty("WorkConfigureFile");// 解析该xml文件ConfigureFileFw configureFileFw = new ConfigureFileFw(); configureFileFw.parseConfigXmlFile(WorkConfigureFile); } }
#propertityUtil類別如下
1 package com.test; 2 3 import java.io.FileInputStream; 4 import java.io.FileNotFoundException; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.OutputStream; 8 9 public class propertityUtil { 10 11 /** 12 * prop对像 13 */ 14 private OrderedProperties prop = null; 15 16 /** 17 * 配置文件位置,默认为***-config.properties 18 */ 19 private String CONFIGPATH = "project-config.properties"; 20 21 /** 22 * 构造函数 23 */ 24 public propertityUtil() { 25 init(); 26 } 27 28 /** 29 * 构造函数 30 * 31 * @param prop 32 * prop对像 33 */ 34 public propertityUtil(OrderedProperties prop) { 35 this.prop = prop; 36 } 37 38 /** 39 * 构造函数 40 * 41 * @param conf 42 */ 43 public propertityUtil(String conf) { 44 this.CONFIGPATH = conf; 45 init(CONFIGPATH); 46 } 47 48 /** 49 * 取得属性 50 * 51 * @return 52 */ 53 public OrderedProperties getProp() { 54 return prop; 55 } 56 57 /** 58 * 设置属性 59 * 60 * @param prop 61 */ 62 public void setProp(OrderedProperties prop) { 63 this.prop = prop; 64 } 65 66 /** 67 * 实例 68 * 69 * @param configpath 70 * @return 71 */ 72 public static propertityUtil getInstance(String configpath) { 73 return new propertityUtil(configpath); 74 } 75 76 /** 77 * 读取属性文件 78 * 79 * @param configpath 80 */ 81 private void init(String configpath) { 82 this.CONFIGPATH = configpath; 83 init(); 84 } 85 86 /** 87 * 初始化prop,从文件中读取 88 */ 89 private void init() { 90 if (this.CONFIGPATH == null || this.CONFIGPATH.length() == 0) { 91 System.out.println("No configFile"); 92 } else { 93 94 String srcDir = System.getProperty("user.dir"); 95 srcDir = srcDir + "/resources/properties/" + this.CONFIGPATH; 96 prop = new OrderedProperties(); 97 FileInputStream fin = null; 98 try { 99 fin = new FileInputStream(srcDir);100 prop.load(fin);101 } catch (FileNotFoundException e2) {102 e2.printStackTrace();103 } catch (IOException e2) {104 e2.printStackTrace();105 }106 107 // InputStream is = getClass().getResourceAsStream(this.CONFIGPATH);108 // prop = new Properties();109 // try {110 // prop.load(is);111 // } catch (Exception e) {112 // e.printStackTrace();113 // }114 }115 }116 117 /**118 * 取得属性值类119 * 120 * @param propName121 * @return122 */123 public String getProperty(String propName) {124 return getProperty(propName, "");125 }126 127 /**128 * 取得属性值类129 * 130 * @param propName131 * @return132 */133 public String getProperty(String propName, String defValue) {134 if (prop == null)135 init();136 String s = defValue;137 try {138 s = prop.getProperty(propName);139 if (s == null) {140 s = defValue;141 } else {142 s = s.trim();143 }144 } catch (Exception e) {145 e.printStackTrace();146 }147 return s;148 }149 150 /**151 * 设置属性152 * 153 * @param propName154 * @param value155 */156 public void setProperty(String propName, String value) {157 if (prop == null)158 init();159 try {160 prop.setProperty(propName, value);161 storeProperty();162 } catch (Exception e) {163 e.printStackTrace();164 }165 }166 167 /**168 * 保存属性文件169 */170 private void storeProperty() {171 try {172 String path = prop.getProperty("path");173 OutputStream out = new FileOutputStream(path);174 prop.store(out, " -- sl Soft Config File -- ");175 out.close();176 } catch (Exception ioe) {177 ioe.printStackTrace();178 }179 }180 }
#xml解析類別
1 package com.test; 2 3 import java.io.File; 4 import java.util.HashMap; 5 import java.util.List; 6 import java.util.Map; 7 import org.dom4j.Document; 8 import org.dom4j.Element; 9 import org.dom4j.io.SAXReader; 10 11 /** 12 * 业务方法配置管理类 13 * @author 14 * 15 */ 16 public class ConfigureFileFw { 17 18 /** 19 * 业务方法配置Map 20 */ 21 private static Map<String, Map<String, String>> workAttributes = new HashMap<String, Map<String, String>>(); 22 23 private Document document = null; 24 25 private Element rootElement = null; 26 27 /** 28 * 获取所有业务 29 * @return 30 */ 31 public Map<String, Map<String, String>> getWorkAttributes() { 32 return workAttributes; 33 } 34 /** 35 * 根据world获取对应业务 36 * @return 37 */ 38 public Map<String, String> getWorkAttributesByWorkId(String workId) { 39 return workAttributes.get(workId); 40 } 41 42 /** 43 * 判断是否包含该业务 44 * @param workId 45 * @return 46 */ 47 public String hasWorkId(String workId) { 48 //Modified by wxq 2016/12/29 49 //return workAttributes.containsKey(workId); 50 String temp = ""; 51 for(String configWorkId:workAttributes.keySet()){ 52 if (configWorkId.contains(".*")){ 53 temp = configWorkId.substring(0,configWorkId.indexOf(".")); 54 } 55 else{ 56 temp = configWorkId; 57 } 58 if(workId.contains(temp)){ 59 return configWorkId; 60 } 61 } 62 return ""; 63 //Ended by wxq 2016/12/29 64 65 } 66 /** 67 * 根据业务名称获取业务 68 * @param workName 69 * @return 70 */ 71 public Map<String, String> getWorkAttributesByWorkName(String workName) { 72 73 for (String str : workAttributes.keySet()) { 74 Map<String, String> temp = workAttributes.get(str); 75 if (temp.get("name").equals(workName)) { 76 return temp; 77 } 78 } 79 return null; 80 } 81 //加入业务方法 82 private void addToWorkAttributes(String workId, Map<String, String> attrMap) { 83 workAttributes.put(workId, attrMap); 84 } 85 /** 86 * 根据传入的配置文件,初始化所有业务 87 * @param fileName 88 */ 89 public void parseConfigXmlFile(String fileName) { 90 try { 91 File f = new File(fileName); 92 SAXReader reader = new SAXReader(); 93 Document doc = reader.read(f); 94 rootElement = doc.getRootElement(); 95 if (!rootElement.equals(null)) { 96 Element works = (Element)rootElement.element("works"); 97 List<?> workList = works.elements(); 98 for (int i = 0; i < workList.size(); i++) { 99 Element work = (Element) workList.get(i);100 String workID = work.elementText("id");101 String workName = work.elementText("name");102 String workDescription = work.elementText("description");103 String workMethod = work.elementText("method");104 String dll = work.elementText("dll");105 String class1 = work.elementText("class");106 String workSend = work.elementText("send");107 String workReceive = work.elementText("receive");108 109 Map<String, String> workAttrMap = new HashMap<String, String>();110 workAttrMap.put("id", workID);111 workAttrMap.put("name", workName);112 workAttrMap.put("description", workDescription);113 workAttrMap.put("method", workMethod);114 workAttrMap.put("dll", dll);115 workAttrMap.put("class", class1);116 workAttrMap.put("send", workSend);117 workAttrMap.put("receive", workReceive);118 workAttributes.put(workID, workAttrMap);119 }120 }121 122 } catch (Exception e) {123 System.out.println("exception:" + e.getMessage());124 }125 }126 127 }
以上是讀取設定檔properties並解析xml的main方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!