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为属性文件名,放在包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 返回对应的字符串,如果无,返回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<String, String> getAllProperties() {

if(properties==null)

properties = loadProps();

Map<String, String> map = new HashMap<String, String>();

// 获取所有的键值

Iterator<String> 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");

}

}

/**

* 设置path值

* @param path

*/

public void setPath(String path){

this.path = path;

}

}

以上是 Java 操作Properties配置文件详解 的全部内容, 来源链接: utcz.com/z/342604.html

回到顶部