当前位置: 首页 > news >正文

根据不同省份读取配置文件

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

       有时候我们会遇到一套管理系统代码部署到不同省份,不同省份的又要有不同的需求,这时候我们就要考虑在配置文件中使用些参数来控制 代码里面的某些功能的开关

获取maven项目resource路径

//Constants 为这个变量所在类的名称
public static final String resourcePaths =Constants.class.getClassLoader()
.getResource("").getPath();
   

我们来看看代码是怎么实现的 配置文件里面内容是键值对的形式 所以我们用一个hashMap来存储单个配置

文件里面的内容 有多个配置文件 所以我们考虑构造一个双重Map 

private static Map<String, Map<String, Object>> confirParamMap 
= new HashMap<String,Map<String,Object>>();

 

怎样解析单个XML中的内容到map

<?xml version="1.0" encoding="UTF-8"?>
<config>
	<!--admin门户的地址,绝对地址-->
	<adminPath>/admin</adminPath>
	<!-- 企业用户角色ID(已认证) -->
	<staffIdRoles>7</staffIdRoles>
	<!--用户角色ID(已认证) -->
	
</config>

我们用dom4j解析XML

针对上面的XML文件我们要获取的数据是一个 Element元素组成的集合

所以我们构造这样一个方法 传入参数是一个 List<Element> 返回一个 Map集合


	private static Map<String, Object> getAllElements(List<Element> childElements, Map<String, Object> mapEle) {
		for (Element ele : childElements) {
		mapEle.put(ele.getName(), ele.getText());
			if (ele.elements().size() > 0) {
			
				mapEle = getAllElements(ele.elements(), mapEle);
			}
		}
		return mapEle;
	}

读取config.properties下的默认省份

public class propertyUtil {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
         readProperty(Constants.resourcePaths+"config/config.properties");
	}
    public static Map<String,Object> readProperty(String filePath){
	 Properties prop = new Properties();   
	 Map<String,Object> map = new HashMap<String,Object>();
		    try{
		      //读取属性文件a.properties
		     InputStream in = new BufferedInputStream (new FileInputStream(filePath));
		     prop.load(in);     ///加载属性列表
	         Iterator<String> it=prop.stringPropertyNames().iterator();
	         while(it.hasNext()){
		        String key=it.next();
	            System.out.println(key+":"+prop.getProperty(key));
	            map.put(key, prop.getProperty(key));
		     }
		      in.close();
		         return map;
		     }
		    catch(Exception e){
		        	 return map;
		     }
			
	}

}

 

读取function 下配置文件(notifyContent.xml,system.xml) 先读取最外层默认的配置文件 再读取当前省份配置文件,并获取他们的节点

private static void initMap(String filePath) {// 获取某个目录下的配置文件
		File configurefile = new File(filePath);
		File[] files = configurefile.listFiles();
		for (File file : files) {// 目录下面几个XML文件
			if (!file.isDirectory()) {
				String fileName = file.getName();
			    String[] fileNameList = fileName.split("\\.");//点号需要转义才能分割
					
				SAXReader reader = new SAXReader();
				Document document = null;
				try {
					document = reader.read(file);
				} catch (DocumentException e) {
					// TODO Auto-generated catch block
					System.out.println("读取文件失败");
					e.printStackTrace();
				}
                //读取XML根节点
				Element root = document.getRootElement();
				// 根节点下面的所以子节点
                //也就是 <!--admin门户的地址,绝对地址-->
	                      <adminPath>/admin</adminPath>
	                      <!-- 企业用户角色ID(已认证) -->
	                           <staffIdRoles>7</staffIdRoles>
	                      <!--用户角色ID(已认证) -->
				List<Element> childElements = root.elements();
				Map<String, Object> mapEle = new HashMap<String, Object>();
				// 遍历子节点
				mapEle = getAllElements(childElements, mapEle);
                if(confirParamMap.containsKey(fileNameList[0])){
                	//比如现在获取12 目录下面的system.xml 之前已经把外层的system.xml读进去了
                	 for (Entry<String, Object> entry : mapEle.entrySet()) {
          			  
          			 confirParamMap.get(fileNameList[0]).put(entry.getKey(), entry.getValue());
          			  }
                	
                }else{
    				confirParamMap.put(fileNameList[0], mapEle);
                }

			}

		}

	}

这样我们在这个类初始化时就调用方法initMap就能将配置文件里面的内容放到双重map里面去了

现附上整个代码

package com.dlh.test;

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.dlh.common.util.Constants;

public class xmlParseSingleton {

	private static Map<String, Map<String, Object>> confirParamMap = new HashMap<String, Map<String,Object>>();
    
	public static Map<String, Map<String, Object>> getConfirParamMap() {
		return confirParamMap;
	}

	
	private xmlParseSingleton() {
		System.out.println("初始化");

	}

	private static class innerClass {
		public static final xmlParseSingleton instance = new xmlParseSingleton();

	}

	public static xmlParseSingleton getInstance() {

		return innerClass.instance;
	}

	static {
		initMap(Constants.resourcePaths + "config/function/");
		Map<String,Object> propMap =propertyUtil.readProperty(Constants.resourcePaths+"config/config.properties");
		initMap(Constants.resourcePaths + "config/function/"+propMap.get("DEFAULT_PROVINCE"));
	}

	//
	private static void initMap(String filePath) {// 获取某个目录下的配置文件
		File configurefile = new File(filePath);
		File[] files = configurefile.listFiles();
		for (File file : files) {// 目录下面几个XML文件
			if (!file.isDirectory()) {
				String fileName = file.getName();
			    String[] fileNameList = fileName.split("\\.");//点号需要转义才能分割
					
				SAXReader reader = new SAXReader();
				Document document = null;
				try {
					document = reader.read(file);
				} catch (DocumentException e) {
					// TODO Auto-generated catch block
					System.out.println("读取文件失败");
					e.printStackTrace();
				}
				Element root = document.getRootElement();
				// 子节点
				List<Element> childElements = root.elements();
				Map<String, Object> mapEle = new HashMap<String, Object>();
				// 遍历子节点
				mapEle = getAllElements(childElements, mapEle);
                if(confirParamMap.containsKey(fileNameList[0])){
                	//比如现在获取12 目录下面的system.xml 之前已经把外层的system.xml读进去了
                	 for (Entry<String, Object> entry : mapEle.entrySet()) {
          			  
          			 confirParamMap.get(fileNameList[0]).put(entry.getKey(), entry.getValue());
          			  }
                	
                }else{
    				confirParamMap.put(fileNameList[0], mapEle);
                }

			}

		}

	}

	private static Map<String, Object> getAllElements(List<Element> childElements, Map<String, Object> mapEle) {
		for (Element ele : childElements) {
		/*	System.out.println("key:" + ele.getName());
			System.out.println("value:" + ele.getText());*/
			mapEle.put(ele.getName(), ele.getText());
			if (ele.elements().size() > 0) {
			
				mapEle = getAllElements(ele.elements(), mapEle);
			}
		}
		return mapEle;
	}

	public static void main(String[] args) {
		
		System.out.println(	confirParamMap.get("system").size());
		
		
		
	}
}

这里的xml文档的格式比较简单 其实都可以用properties代替

 

转载于:https://my.oschina.net/u/1377006/blog/884705

相关文章:

  • iostat 等运维命令用法
  • 单词最近距离
  • Eclipse安装SVN插件总结
  • 排序算法6--选择排序--简单选择排序
  • KVM安装配置
  • java中Random随机种子使用
  • linux启动顺序
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • Spring Cloud Sleuth使用简介
  • Android学习笔记:Handler初步
  • Corosync+Pacemaker+DRBD+MySQL 实现高可用(HA)的MySQL集群
  • Google Spanner论文翻译
  • Node.js爬虫抓取数据 -- HTML 实体编码处理办法
  • 牛客网-约数的个数
  • 变量get、set设置
  • angular2 简述
  • docker python 配置
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • IDEA 插件开发入门教程
  • Java|序列化异常StreamCorruptedException的解决方法
  • Javascript基础之Array数组API
  • Java读取Properties文件的六种方法
  • js中forEach回调同异步问题
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • SpringBoot几种定时任务的实现方式
  • vue 配置sass、scss全局变量
  • WebSocket使用
  • WePY 在小程序性能调优上做出的探究
  • 安卓应用性能调试和优化经验分享
  • 初识 beanstalkd
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 好的网址,关于.net 4.0 ,vs 2010
  • 蓝海存储开关机注意事项总结
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 算法-图和图算法
  • 微信小程序填坑清单
  • 我的zsh配置, 2019最新方案
  • 我感觉这是史上最牛的防sql注入方法类
  • 一个JAVA程序员成长之路分享
  • ​什么是bug?bug的源头在哪里?
  • #考研#计算机文化知识1(局域网及网络互联)
  • $.ajax,axios,fetch三种ajax请求的区别
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (补)B+树一些思想
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (算法)Game
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)树状数组
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .net中应用SQL缓存(实例使用)
  • @Async注解的坑,小心
  • @EventListener注解使用说明
  • [ 第一章] JavaScript 简史
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证