使用枚举单例实现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()方法,如果参数不加"/"那么表示当前类路径,如果加"/"表示根路径下。

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

时间: 2024-10-22 15:30:58

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

为什么我墙裂建议大家使用枚举来实现单例

我们知道,单例模式,一般有七种写法,那么这七种写法中,最好的是哪一种呢?为什么呢?本文就来抽丝剥茧一下. 哪种写单例的方式最好 在StakcOverflow中,有一个关于What is an efficient way to implement a singleton pattern in Java?的讨论: 如上图,得票率最高的回答是:使用枚举. 回答者引用了Joshua Bloch大神在<Effective Java>中明确表达过的观点: 使用枚举实现单例的方法虽然还没有广泛采用,但是单元

属性传值,协议传值,block传值,单例传值四种界面传值方式

一.属性传值 对于属性传值而言,相对于其它的三种 方法来说,是最基础,最简单的一种 方法,但,属性传值 有很大的局限性,因为是适用于第一个界面向第二个界面传 值,第二个向第三个界面传值等等.N界面向N + 1界面传值.而在此基础上,必须知道跳转界面的明确位置及所要传的值的具体类型.在第二个界面中声明所要传值 类型的属性. @interface SecondViewController : UIViewController //声明一个字符串属性来保存第一个界面传过来的字符串内容 @propert

IOS_地图_定位_天气预报_Block回调_单例

H:/1021/00_block回调.h /* 通过block回调 定义block代码块,目的是解析完成之后调用 返回值是 void 参数是 数组,里面的每个成员是一个NSString*/ typedef void(^WeatherFinishedBlock)(NSArray *dataList); @interface WeatherXMLPaser : NSObject // 解析器解析数据,参数1是要解析的数据,参数2是解析完毕回调的代码块 - (void)parserWeatherDat

GOF设计模式之1:单例设计模式

1.单例设计模式核心作用: 保证一个类只有一个实例,并且提供了访问该实例的全局访问点 2.常见应用场景: window的任务管理器 项目中读取配置文件一般也是一个单例模式 数据库连接池的设计也是采用单例模式,因为数据库连接是一种数据库资源 操作系统的文件管理系统,也是单例模式,一个操作系统只能有一个文件系统 Application也是单例的应用(Servlet编程或者Android的Application类) 在Spring中,每个bean默认也是单例的,这样的有点儿事Spring容器可以管理

Java设计模式:Singleton(单例)模式

概念定义 Singleton(单例)模式是指在程序运行期间, 某些类只实例化一次,创建一个全局唯一对象.因此,单例类只能有一个实例,且必须自己创建自己的这个唯一实例,并对外提供访问该实例的方式. 单例模式主要是为了避免创建多个实例造成的资源浪费,以及多个实例多次调用容易导致结果出现不一致等问题.例如,一个系统只能有一个窗口管理器或文件系统,一个程序只需要一份全局配置信息. 应用场景 资源共享的情况下,避免由于资源操作时导致的性能或损耗等.如缓存.日志对象.应用配置. 控制资源的情况下,方便资源之

UI_12 ModalViewController(模态),单例设计模式

?.模态viewController 1.介绍 程序中切换??,可以使?UINavigationController.通过导航功能实现??切换.使用    pushViewController:animated:该方法显示的视图具有层级关系;而使用模态视图控制器presentViewController:animated:completion显示的视图与之前的视图控制器平级(或者说是两个不相干的层级). 使用场景 临时展??些内容.例如:程序中?户登录,通讯录中添加联系?等等. UIImageP

iOS基础之单例传值

在之前的界面通信中,我们讲诉了3种传值方法,现在我们提供一种更为方便的传值方法叫做单例传值. 单例的优点在于创建时是全局变量,可以在外部可以使用,没有逐级传值的局限性.但是单例传值会有内存问题,不能将单例进行内存释放,大量创建单例传值,会造成内存问题. 代码演示: #import "Handler.h" //创建单例 static Handler *handler = nil; @implementation Handler + (instancetype)shareInstance{

java中你确定用对单例了吗?

作为程序猿这种特殊物种来说,都掌握了一种特殊能力就是编程思想,逻辑比较谨慎,但是有时候总会忽略到一些细节,比如我,一直以来总觉得Singleton是设计模式里最简单的,不用太在意,然而就是因为这种不在意在开发中吃亏了.真的too young to simple. 好不扯淡了,直入主题. 在代码的世界里发现有各种写法的单例,有人说单例有5种,6种,7种- 对于单例的分类这点必须规范下,首先这么多种的分类是根据什么来定义的,基准是什么?否则怎么会有那么多写法. 因此归纳下来,从延迟加载和执行效率的角

java的单例

原文出处: 张新强 1. 前言 单例(Singleton)应该是开发者们最熟悉的设计模式了,并且好像也是最容易实现的--基本上每个开发者都能够随手写出--但是,真的是这样吗?作为一个Java开发者,也许你觉得自己对单例模式的了解已经足够多了.我并不想危言耸听说一定还有你不知道的--毕竟我自己的了解也的确有限,但究竟你自己了解的程度到底怎样呢?往下看,我们一起来聊聊看~ 2. 什么是单例? 单例对象的类必须保证只有一个实例存在--这是维基百科上对单例的定义,这也可以作为对意图实现单例模式的代码进行