首页 > 代码库 > 使用枚举单例实现Xml、properties属性配置文件的操作

使用枚举单例实现Xml、properties属性配置文件的操作

    上一篇文章,介绍了java中四种单例设计模式;其中,可以使用枚举类型方式实现单例设计模式,但是实现的例子比较简单,本文将通过枚举单例,实现如何同时读取xml、properties属性配置文件。在回味枚举单例的使用同时,介绍一些属性配置文件的使用方式。

    1、代码实现

package com.prop.io;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * 读取Xml、Properties属性配置文件
 * 该类设计的仅仅是固定路径的读取属性配置文件,当然可以去设计的更加强大,
 * 动态的读取不同的属性文件。这里不做设计介绍,仅仅介绍如果利用枚举单例,
 * 以及如何读取属性配置文件
 * @author wangzp
 *
 */
public enum IoProp {
	/**
	 * .properties属性配置文件单例
	 */
	PROP_INSTANCE("/config/jdbc.properties", false){
		@Override
		public void init(String filePath, boolean isXml) {
			try {
				prop = new Properties();
				prop.load(IoProp.class.getResourceAsStream(filePath));
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		}
	},
	/**
	 * .xml属性配置文件单例
	 */
	XML_INSTANCE("/config/jdbc.xml", true) {
		@Override
		public void init(String filePath, boolean isXml) {
			try {
				prop = new Properties();
				prop.load(IoProp.class.getResourceAsStream(filePath));
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	};
	
	protected Properties prop;
	
	/**
	 * 配置文件相对路径
	 */
	private String filePath;
	
	/**
	 * 是否是xml属性文件类型
	 */
	private boolean isXml;
	
	private IoProp(String filePath, boolean isXml){
		this.filePath = filePath;
		init(filePath, isXml);
	}
	
	public abstract void init(String filePath, boolean isXml);
	
	/**
	 * 获取属性值
	 * @param key
	 * @return
	 */
	public String getProp(String key){
		return prop.getProperty(key);
	}
	
	/**
	 * 设置属性值
	 * @param key
	 * @param value
	 * @param isStore 是否将添加的属性值,映射到文件中
	 */
	public void setProp(String key, String value, boolean isStore){
		Map<String, String> props = new HashMap<String, String>();
		props.put(key, value);
		this.setProps(props, isStore);
	}
	
	/**
	 * 批量这是属性值
	 * @param props 属性值对象
	 * @param isStore 是否将添加的属性值,映射到文件中
	 */
	public void setProps(Map<String, String> props, boolean isStore) { 
		prop.putAll(props);

		try {
			if (isStore){
				String basePath = IoProp.class.getResource("/").getPath();
				File file = new File(basePath + File.separator + filePath);
				if (isXml){
					prop.storeToXML(new FileOutputStream(file, true), "");
				}else {
					prop.store(new FileOutputStream(file, true), "");
				}
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	
}

    2、相关测试

package com.prop.io.test;

import java.util.HashMap;
import java.util.Map;

import org.junit.Test;
import static org.junit.Assert.*;


import com.prop.io.IoProp;

/**
 * 测试{@link IoProp}
 * @author wangzp
 *
 */
public class IoPropTest {

	/**
	 * 测试{@link IoProp#setProp(String, String, boolean)}
	 */
	@Test
	public void testSetProp(){
		Map<String, String> props = new HashMap<String, String>();
		props.put("username", "root");
		props.put("password", "root");
		
		IoProp.PROP_INSTANCE.setProps(props, true);
		IoProp.XML_INSTANCE.setProps(props, true);
	}
	
	/**
	 * 测试{@link IoProp#getProp(String)}
	 */
	@Test
	public void testGetProp(){
		assertEquals(IoProp.PROP_INSTANCE.getProp("username"), "root");
		assertEquals(IoProp.XML_INSTANCE.getProp("username"), "root");
	}
}

    3、总结

    经验:在开发中属性配置文件,几乎是必不可少的元素;开发时总是面临线下环境和线上环境的困扰,你可以通过动态设置属性配置文件,更加友好的管理属性配置文件。这样当你仅仅需要更新属性值的时候,不再需要打包更新了,而是直接通过接口方式实现。

    注:读取配置文件可以使用:类.class.getResrouceAsStream()方法,如果参数不加"/"那么表示当前类路径,如果加"/"表示根路径下。

    

本文出自 “java程序冥” 博客,请务必保留此出处http://793404905.blog.51cto.com/6179428/1541679