java之Properties配置文件介绍附源码
java中的properties文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件,文件的内容是格式是"键=值"的格式,在properties
文件中,可以用"#"来作注释,properties文件在Java编程中用到的地方很多,操作很方便。
Properties类的重要方法
Properties 类存在于胞 Java.util 中,该类继承自 Hashtable
1. load ( InputStream inStream) ,从输入流中读取属性列表(键和元素对)。通过对指定的文件(比如说上面的 test.properties 文件)进行装载来获取该文
件中的所有键 - 值对。以供 getProperty ( String key) 来搜索。
2.getProperty ( String key) , 用指定的键在此属性列表中搜索属性。也就是通过参数 key ,得到 key 所对应的 value。
3. propertyNames() ,返回属性列表中所有键的枚举,如果在主属性列表中未找到同名的键,则包括默认属性列表中不同的键。
4. put(K key, V value) ,将指定 key 映射到此哈希表中的指定 value。
5.setProperty ( String key, String value) ,调用 Hashtable 的方法 put 。他通过调用基类的put方法来设置 键 - 值对。
6.store ( OutputStream out, String comments) , 以适合使用 load 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表
(键和元素对)写入输出流。与 load 方法相反,该方法将键 - 值对写入到指定的文件中去。
7. clear () ,清除所有装载的 键 - 值对。该方法在基类中提供。
注意:使用时,请注意properties文件的路径,不同的创建输入流的方式,输入的路径可以都有差距,如有的需要加上src/,有的加了还会有错.
package cn.java.test.particularly;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Properties;
/**
* Properties 类表示了一个持久的属性集。
* Properties 可保存在流中或从流中加载。 属性列表中每个键及其对应值都是一个字符串。
* 一般把Properties 类所要加载的配置文件的后缀名命名为:.properties;
* 这种文件以key=value格式存储内容,代码中可以使用Properties类来读取这个文件 String ;
* value=p.getProperty(key);就能得到对应的数据 一般这个文件作为一些参数的存储,代码就可以灵活一点
*
* 关键类: Properties -----加载 Properties配置文件
* Enumeration-----返回Properties中属性列表中所有键的枚举
*
* Properties配置文件的作用:
* 1.优点在于有利于你以后的代码重构,维护方便. 程序如何需要改动,有的时候直接修改配置文件就可以了。
* java ee开发中常常用在工程很多地方: 比如平常状态下我们临时修改HOST,PORT(端口号)的时候比较麻烦,需要修改代码,
* 但是有配置文件就不一样了,只需要修改配置文件等号后面的数据就可以了,不需要再去频繁修改代码,这一点非常重要.
* 2.还有配合一些设计模式使用,比如使用代理模式,通过使用properties文件就更能隐藏细节(反射实例化类),和方便修改了。
*
* 3.当然也能用于一些程序的固定设置,一组配置(类似win下ini)。
*
* 注意:由于难以表达层次, 复杂点可以用xml做配置。
*/
public class Test_properties {
public static void main(String[] args) {
// 系统properties文件;
print_sys_info();
// 自定义properties文件;
String my_propertiest_url = "my_propertiest.properties";
// 根据properties文件路径获取properties类对象;
Properties myProperties = get_properties(my_propertiest_url);
// 打印properties文件里面的所有信息;
print_all_info(myProperties);
// 写入信息到properties文件中。
To_updata_properties_info(my_propertiest_url, "姓名", "张三", "年龄", "19");
// Properties对象的clear () 方法是清空运行内存中Properties对象的输入流,不会对源文件造成影响;
}
// 系统properties文件;
public static void print_sys_info()
{
/*
* // 打印系统properties文件(里面是系统参数)的信息;
* System.getProperties().list(System.out);
*/
/*
* //指定系统参数查看,请搜集相关系统properties文件key查看。
* //详细参数介绍,请看:http://blog.csdn.net/coolhty/article/details/3260659 ;
*/
Properties props = System.getProperties(); // 系统属性
System.out.println("Java的运行环境版本:" + props.getProperty("java.version"));
System.out.println("Java的运行环境供应商:" + props.getProperty("java.vendor"));
System.out.println("Java供应商的URL:"
+ props.getProperty("java.vendor.url"));
System.out.println("Java的安装路径:" + props.getProperty("java.home"));
}
// 根据Properties文件地址,返回对应的Properties对象;
public static Properties get_properties(String properties_url) {
// Properties 类表示了一个持久的属性集;
Properties myProperties = new Properties();
try {
// 以下是加载配置文件my_propertiest.properties的两种方式(.properties只是一种规范,可以为其他如:.txt);
// 第一种:
myProperties.load(Object.class.getClass().getClassLoader()
.getSystemResourceAsStream(properties_url));
/*
* // 第二种:使用FileInputStream获取输入流需要加上src/ myProperties.load(new
* FileInputStream("src/my_propertiest.properties"));
*/
} catch (Exception e) {
// TODO Auto-generated catch block
System.err.println("路径,可能有错,请仔细查看");
}
return myProperties;
}
// 打印properties文件里面的所有信息;
public static void print_all_info(Properties myProperties) {
// 返回属性列表中所有键的枚举,如果在主属性列表中未找到同名的键,则包括默认属性列表中不同的键。
Enumeration my_enumeration = myProperties.propertyNames();
// 判断此枚举是否还包含元素,。
// 仅当此枚举对象至少还包含一个可提供的元素时,才返回 true;否则返回 false。
System.out
.println("循环输出properties元素key和value \n-------------------------");
while (my_enumeration.hasMoreElements()) {
// 如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素。
// 获取key值;
String properties_key = my_enumeration.nextElement().toString();
// 根据key读取value
String properties_values = myProperties.getProperty(properties_key);
// 打印元素key和value;
System.out.println("获取了properties元素key:" + properties_key
+ "________value值为:" + properties_values);
}
/*
* 修改内存中的key和value的值(临时的,想要修改源数据请参照下面的方法updata_properties_info);
* 修改properties文件里面的属性值;---》Properties只能修改运行内存中的配置文件流的数据
* ,无法真正修改源文件,所以当第二次打开这个流的时候依然是第一次打开数据的样子;;
*/
myProperties.setProperty("key", "这是修改了properties文件key的value的信息");
// 查看修改后的信息;(由于)
String str = str = myProperties.getProperty("key");
System.out.println("\n修改key后对应的key在配置文件中的信息:" + str);
}
// 写入信息到properties文件中。
public static void To_updata_properties_info(String properties_url,
String key_01, String value_01, String key_02, String value_02) {
Properties myProperties = new Properties();
// 创建IO流对象,以加载之前的properties数据(I),和修改properties数据(O);
InputStream myInputStream = null;
OutputStream myOutputStream = null;
try {
// 使用FileInputStream获取输入流需要加上src/
String str_ = "src/" + properties_url;
// 根据properties配置文件路径。实例化IO;
myInputStream = new FileInputStream(str_);
/*
* 从输入流中读取属性列表(键和元素对),如果不加这段代码(load),那么就会被后面写入的内容的覆盖 ;
* 几次测试发现必须在获取输出流之前就使用load加载properties配置文件不然之前的内容就会丢失被后面写入的内容的覆盖
* ,原因不明
*/
myProperties.load(myInputStream);
// 必须在Properties加载完Properties文件的输入流才实例化Properties文件的输出流;
myOutputStream = new FileOutputStream(str_);
// 添加信息方法1:
// 调用 Hashtable 的方法 put添加,返回值为一个Object对象,该对象就是所传入的value对象。
Object s = myProperties.put(key_01, value_01);
System.out.println("你所出传入的value值为:" + value_01);
// 添加信息方法2:
// 使用setProperty方法,强制要求为属性的键和值使用字符串,返回值为一个Object对象,该对象就是所传入的value对象。返回值为一个Object对象,该对象就是所传入的value对象。;
Object s2 = myProperties.setProperty(key_02, value_02);
System.out.println("你所出传入的value值为:" + value_02);
myProperties
.store(myOutputStream, "这里是注释,以下就是我对于的properties配置文件信息");
} catch (Exception e) {
// TODO Auto-generated catch block
System.err.println("路径,可能有错,请仔细查看");
}
}
}