Java 操作Properties配置文件详解

网友投稿 382 2023-05-17


Java 操作Properties配置文件详解

1 简介:

JDK提供的java.util.Properties类继承自Hashtable类并且实现了Map接口,是使用一种键值对的形式来保存属性集,其中键和值都是字符串类型。

java.util.Properties类提供了getProperty()和setProperty()方法来操作属性文件,同时使用load()方法和store()方法加载和保存Properties配置文件。

java.util.ResourceBundle类也提供了读取Properties配置文件的方法,ResourceBundle是一个抽象类。

2.Properties中的主要方法

1)load(InputStream inStream):该方法可以从.properties属性文件对应的文件数入流中,加载属性列表到Properties类对象中。load有两个方法的重载:load(InputStream inStream)、load(Reader reader),可根据不同的方式来加载属性文件。

InputStream inStream = TestProperties.class.getClassLoader().getResourceAsStream("demo.properties");

//通过当前类加载器的getResourceAsStream方法获取

//TestProperties当前类名;TestProperties.class.取得当前对象所属的Class对象; getClassLoader():取得该Class对象的类装载器

InputStream in = ClassLoader.getSystemResourceAsStream("filePath");

InputStream inStream = new FileInputStream(new File("filePath")); //从文件获取

InputStream in = context.getResourceAsStream("filePath"); //在servlet中,可以通过context来获取InputStream

InputStream inStream = new URL("path").openStream();            //通过URL来获取

读取方法如下:

Properties pro = new Properties();                //实例化一个Properties对象

InputStream inStream = new FileInputStream("demo.properties");    //获取属性文件的文件输入流

pro.load(nStream);

inStream.close();

2)store(OutputStream out,String comments):这个方法将Properties类对象的属性列表写入.properties配置文件。如下:

FileOutputStream outStream = new FileOutputStream("demo.properties");

pro.store(outStream,"Comment");

outStream.close();

3 ResourceBundle中的主要方法

通过ResourceBundle.getBundle()静态方法来获取,此方法获取properties属性文件不需要加.properties后缀名。也可以从InputStream中获取ResourceBundle对象。

ResourceBundle resource = ResourceBundle.getBundle("com/xiang/demo");//emo为http://属性文件名,放在包com.xiang下,如果是放在src下,直接用test即可

ResourceBundle resource1 = new PropertyResourceBundle(inStream);

String value = resource.getString("name");

在使用中遇到的问题可能是配置文件的路径,当配置文件不在当前类所在的包下,则需要使用包名限定;若属性文件在src根目录下,则直接使用demo.properties或demo即可。

4 Properties操作实例

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Properties;

/**

* Java中Preperties配置文件工具类

* @author shu

*

*/

public class PropsUtil {

private String path = "";

private Properties properties ;

/**

* 默认构造函数

*/

public PropsUtil() {}

/**

* 构造函数

* @param path 传入Properties地址值

*/

public PropsUtil(String path) {

this.path = path;

}

/**

* 加载properties文件

* @return 返回读取到的properties对象

*/

public Properties loadProps(){

InputStream inStream = ClassLoader.getSystemResourceAsStream(path);

try {

if(inStream==null)

throw new FileNotFoundException(path + " file is not found");

properties = new Properties();

properties.load(inStream);

inStream.close();

} catch (IOException e) {

e.printStackTrace();

}

return properties;

}

/**

* 将配置写入到文件

*/

public void writeFile(){

// 获取文件输出流

try {

FileOutputStream outputStream = new FileOutputStream( new File(ClassLoader.getSystemResource(path).toURI()));

properties.store(outputStream, null);

outputStream.close();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

/**

* 通过关键字获取值

* @param key

* @return 返回对应的字符串,如果无http://,返回null

*/

public String getValueByKey(String key) {

if(properties==null)

properties = loadProps();

String val = properties.getProperty(key.trim());

return val;

}

/**

* 通过关键字获取值

* @param key 需要获取的关键字

* @param defaultValue 若找不到对应的关键字时返回的值

* @return 返回找到的字符串

*/

public String getValueByKey(String key,String defaultValue){

if(properties==null)

properties = loadProps();

return properties.getProperty(key, defaultValue);

}

/**

* 获取Properties所有的值

* @return 返回Properties的键值对

*/

public Map getAllProperties() {

if(properties==null)

properties = loadProps();

Map map = new HashMap();

// 获取所有的键值

Iterator it=properties.stringPropertyNames().iterator();

while(it.hasNext()){

String key=it.next();

map.put(key, properties.getProperty(key));

}

/*Enumeration enumeration = properties.propertyNames();

while (enumeration.hasMoreElements()) {

String key = (String) enumeration.nextElement();

String value = getValueByKey(key);

map.put(key, value);

}*/

return map;

}

/**

* 往Properties写入新的键值且保存

* @param key 对应的键

* @param value 对应的值

*/

public void addProperties(String key, String value) {

if(properties==null)

properties = loadProps();

properties.setProperty(key, value);

try {

writeFile();

} catch (Exception e) {

throw new RuntimeException("write fail");

}

}

/**

* 更新配置文件

* @param key 对应的键

* @param value 对应的值

*/

public void update(String key,String value){

if(properties==null)

properties = loadProps();

if(properties.containsKey(key))

properties.replace(key, value);

try {

writeFile();

} catch (Exception e) {

throw new RuntimeException("write fail");

}

}

/**

* 刪除某一鍵值对

* @param key

*/

public void deleteByKey(String key){

if(properties==null)

properties = loadProps();

if(!properties.containsKey(key))

throw new RuntimeException("not such key");

properties.remove(key);

try {

writeFile();

} catch (Exception e) {

throw new RuntimeException("write fail");

}

}

/**

* 设置http://path值

* @param path

*/

public void setPath(String path){

this.path = path;

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java 中Timer和TimerTask 定时器和定时任务使用的例子
下一篇:SpringMVC Controller 返回值的可选类型详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~