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

本文介绍如何使用枚举单例在Python3中实现XML和properties配置文件的读取与写入操作。通过示例代码详细展示了配置文件的加载、属性设置和测试过程,帮助开发者更好地管理和更新属性配置。
摘要由CSDN通过智能技术生成

上一篇文章,介绍了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 props = new HashMap();

props.put(key, value);

this.setProps(props, isStore);

}

/**

* 批量这是属性值

* @param props 属性值对象

* @param isStore 是否将添加的属性值,映射到文件中

*/

public void setProps(Map 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 props = new HashMap();

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值