JAVA项目初始化xml配置文件类
单例模式加载配置文件类
使用架包:dom4j-1.6.1.jar、jaxen-1.1-beta-6.jar、log4j-1.2.17.jar
代码:
package com.wjq.project.loadFile;import java.io.InputStream;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import org.apache.log4j.Logger;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader;/** * @Title:JAVA项目初始化xml配置文件类 * @Description: 使用dom4j解析xml配置文件; 使用单例模式初始化类; 定时重新加载配置文件,时间可配 * @author wjq * @date 2013-07-19 */public class LoadXmlFile_dom4j {//日志private static Logger log = Logger.getLogger(LoadXmlFile_dom4j.class);//配置文件private static final String CONFIG_FILE = "loadFile_loadXmlFile.xml";//dom4j 对象private Document document=null;//IP地址private String ip = null;//端口号private String port = null;//重启加载配置文件周期,默认值:12,单位:小时private int reloadTime=12;//告警级别转换private Map<String, String> alarmLevelsMap=new HashMap<String, String>();//工单状态数据转换private Map<String, String> sheetStatusTransMap=new HashMap<String, String>();/////////////////////////////////////////////单例模式 start//////////////////////////////////////////////** * 私有化构造方法 */private LoadXmlFile_dom4j(){log.info("加载配置文件: "+CONFIG_FILE);loadConfig();//开启定时加载配置文件的线程Thread reloadConfFile = new Thread(new ReloadConfFile());reloadConfFile.start();}/** * 内部静态类,实例化本类对象 * @author wjq * */public static class ClassInstance{//在内部静态类中实例化LoadXmlFile对象private static final LoadXmlFile_dom4j instance=new LoadXmlFile_dom4j();}/** * 对外提供本类实例化对象 * @return */public static LoadXmlFile_dom4j getInstance(){return ClassInstance.instance;}/////////////////////////////////////////////单例模式 end//////////////////////////////////////////////** * 加载配置文件信息 */ private void loadConfig() { try { InputStream inputStream = LoadXmlFile_dom4j.class.getResourceAsStream("/project/"+CONFIG_FILE); if(inputStream!=null){ SAXReader saxReader=new SAXReader(); this.document=saxReader.read(inputStream); if(document==null){ return; } this.ip=loadSingleNode("config/myProject/ip"); this.port=loadSingleNode("config/myProject/port"); this.reloadTime=Integer.valueOf(loadSingleNode("config/myProject/reloadTime")); this.alarmLevelsMap=loadAttributeMap(alarmLevelsMap,"config/myProject/alarmLevels"); this.sheetStatusTransMap=loadTextMap(sheetStatusTransMap,"config/myProject/sheetStatusTrans"); }else{ log.error("配置文件不存在,请确认已经将配置文件["+CONFIG_FILE+"]已经放在[project]目录下"); }} catch (Exception e) {log.error("解析配置文件["+CONFIG_FILE+"]异常",e);} } /** * ReloadConfFile thread * 定时重新加载xml配置文件 线程 * 默认每隔12小时加载一次xml配置文件, * @author wjq */private class ReloadConfFile implements Runnable {public void run() {// TODO Auto-generated method stubwhile(true) {try {Thread.sleep(reloadTime*60*60*1000);} catch (InterruptedException e) {}log.info("重新加载配置文件:"+CONFIG_FILE);loadConfig();}}} /** * 获取单个节点的文本值 * @param nodePath * @return */ private String loadSingleNode(String nodePath){ Element element=(Element)document.selectSingleNode(nodePath); String nodeText=element.getTextTrim(); log.info(element.getName()+"="+nodeText); return nodeText; } /** * 加载from、to在元素属性节点上的转换关系 * from为key、to为value * @param fromToMap 存储对应关系的map * @param nodePath 节点路径 * @return */private Map<String, String> loadAttributeMap(Map<String, String> fromToMap,String nodePath){//日志信息String logMessage="";//先清空Map内容fromToMap.clear();Element element=(Element) document.selectSingleNode(nodePath);logMessage=element.getName()+":[";List elementList =element.elements();Iterator iter=elementList.iterator();while(iter.hasNext()) {Element el=(Element)iter.next();String key= el.attributeValue("from").trim();String value= el.attributeValue("to").trim();fromToMap.put(key, value);logMessage=logMessage+";from="+key+",to="+value;}logMessage=logMessage.replaceFirst(";", "")+"]";log.info(logMessage);return fromToMap;}/** * 加载from、to为单独元素的转换关系 * from为key、to为value * @param fromToMap 存储对应关系的map * @param nodePath 节点路径 * @return */private Map<String, String> loadTextMap(Map<String, String> fromToMap,String nodePath){//日志信息String logMessage="";//先清空Map内容fromToMap.clear();Element element=(Element) document.selectSingleNode(nodePath);logMessage=element.getName()+":[";List elementList =element.elements();Iterator iter=elementList.iterator();while(iter.hasNext()) {Element el=(Element)iter.next();String key= el.element("from").getTextTrim();String value= el.element("to").getTextTrim();logMessage=logMessage+";from="+key+",to="+value;}logMessage=logMessage.replaceFirst(";", "")+"]";log.info(logMessage);return fromToMap;} public String getIp() {return ip;}public void setIp(String ip) {this.ip = ip;}public String getPort() {return port;}public void setPort(String port) {this.port = port;}public Map<String, String> getAlarmLevelsMap() {return alarmLevelsMap;}public void setAlarmLevelsMap(Map<String, String> alarmLevelsMap) {this.alarmLevelsMap = alarmLevelsMap;}public Map<String, String> getSheetStatusTransMap() {return sheetStatusTransMap;}public void setSheetStatusTransMap(Map<String, String> sheetStatusTransMap) {this.sheetStatusTransMap = sheetStatusTransMap;}/** * @param args */public static void main(String[] args) {LoadXmlFile_dom4j loadXmlFile=LoadXmlFile_dom4j.getInstance();}}
?
配置文件:
<?xml version="1.0" encoding="Gb2312"?><config><myProject><!-- IP地址 --><ip>127.0.0.1</ip><!-- 端口号 --><port>51088</port><!-- 第一种数据转换方法 from为key、to为value--><alarmLevels><level from="紧急告警" to="1" /><level from="重要告警" to="2" /><level from="次要告警" to="3" /><level from="警告告警" to="4" /></alarmLevels><!-- 第二种数据转换方法 from为key、to为value--><sheetStatusTrans><sheetStatusRecord><from>草稿</from><to>1</to></sheetStatusRecord><sheetStatusRecord><from>一级处理中</from><to>2</to></sheetStatusRecord><sheetStatusRecord><from>二级处理中</from><to>3</to></sheetStatusRecord><sheetStatusRecord><from>三级处理中</from><to>4</to></sheetStatusRecord></sheetStatusTrans><!-- 重新读取配置文件周期,默认值:12,单位:小时 --><reloadTime>12</reloadTime></myProject></config>
?
?