java之Properties配置文件介绍

                                      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("路径,可能有错,请仔细查看");
		}
	}


}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值