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

前端之家收集整理的这篇文章主要介绍了使用枚举单例实现Xml、properties属性配置文件的操作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

1、代码实现

packagecom.prop.io;

importjava.io.File;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.util.HashMap;
importjava.util.Map;
importjava.util.Properties;

/**
*读取Xml、Properties属性配置文件
*该类设计的仅仅是固定路径的读取属性配置文件,当然可以去设计的更加强大,
*动态的读取不同的属性文件。这里不做设计介绍,仅仅介绍如果利用枚举单例,
*以及如何读取属性配置文件
*@authorwangzp
*
*/
publicenumIoProp{
	/**
	*.properties属性配置文件单例
	*/
	PROP_INSTANCE("/config/jdbc.properties",false){
		@Override
		publicvoidinit(StringfilePath,booleanisXml){
			try{
				prop=newProperties();
				prop.load(IoProp.class.getResourceAsStream(filePath));
			}catch(IOExceptione){
				e.printStackTrace();
			}
			
		}
	},/**
	*.xml属性配置文件单例
	*/
	XML_INSTANCE("/config/jdbc.xml",true){
		@Override
		publicvoidinit(StringfilePath,booleanisXml){
			try{
				prop=newProperties();
				prop.load(IoProp.class.getResourceAsStream(filePath));
			}catch(IOExceptione){
				e.printStackTrace();
			}
		}
	};
	
	protectedPropertiesprop;
	
	/**
	*配置文件相对路径
	*/
	privateStringfilePath;
	
	/**
	*是否是xml属性文件类型
	*/
	privatebooleanisXml;
	
	privateIoProp(StringfilePath,booleanisXml){
		this.filePath=filePath;
		init(filePath,isXml);
	}
	
	publicabstractvoidinit(StringfilePath,booleanisXml);
	
	/**
	*获取属性值
	*@paramkey
	*@return
	*/
	publicStringgetProp(Stringkey){
		returnprop.getProperty(key);
	}
	
	/**
	*设置属性值
	*@paramkey
	*@paramvalue
	*@paramisStore是否将添加属性值,映射到文件中
	*/
	publicvoidsetProp(Stringkey,Stringvalue,booleanisStore){
		Map<String,String>props=newHashMap<String,String>();
		props.put(key,value);
		this.setProps(props,isStore);
	}
	
	/**
	*批量这是属性值
	*@paramprops属性值对象
	*@paramisStore是否将添加属性值,映射到文件中
	*/
	publicvoidsetProps(Map<String,String>props,booleanisStore){
		prop.putAll(props);

		try{
			if(isStore){
				StringbasePath=IoProp.class.getResource("/").getPath();
				Filefile=newFile(basePath+File.separator+filePath);
				if(isXml){
					prop.storeToXML(newFileOutputStream(file,true),"");
				}else{
					prop.store(newFileOutputStream(file,"");
				}
			}
		}catch(FileNotFoundExceptione){
			e.printStackTrace();
		}catch(IOExceptione){
			e.printStackTrace();
		}
	}
	
	
}

2、相关测试

packagecom.prop.io.test;

importjava.util.HashMap;
importjava.util.Map;

importorg.junit.Test;
importstaticorg.junit.Assert.*;


importcom.prop.io.IoProp;

/**
*测试{@linkIoProp}
*@authorwangzp
*
*/
publicclassIoPropTest{

	/**
	*测试{@linkIoProp#setProp(String,String,boolean)}
	*/
	@Test
	publicvoidtestSetProp(){
		Map<String,String>();
		props.put("username","root");
		props.put("password","root");
		
		IoProp.PROP_INSTANCE.setProps(props,true);
		IoProp.XML_INSTANCE.setProps(props,true);
	}
	
	/**
	*测试{@linkIoProp#getProp(String)}
	*/
	@Test
	publicvoidtestGetProp(){
		assertEquals(IoProp.PROP_INSTANCE.getProp("username"),"root");
		assertEquals(IoProp.XML_INSTANCE.getProp("username"),"root");
	}
}

3、总结

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

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

原文链接:https://www.f2er.com/xml/298157.html

猜你在找的XML相关文章