java.util.Properties

 

学习目标:
 
1、认识properties文件,理解其含义,会正确创建properties文件。
2、会使用java.util.Properties类来操作properties文件。
3、掌握相对路径,能正确书写一个properties文件的相对路径。
 
一、认识properties文件
 
1、properties文件是一个文本文件
2、properties文件的语法有两种,一种是注释,一种属性配置。
 注    释:前面加上#号
 属性配置:以“键=值”的方式书写一个属性的配置信息。
3、properties文件的一个属性配置信息值可以换行,但键不可以换行。值换行用“\”表示。
4、properties的属性配置键值前后的空格在解析时候会被忽略。
5、properties文件可以只有键而没有值。也可以仅有键和等号而没有值,但无论如何一个属性配置不能没有键。
 
 
例如,下面一个properties文件:
#正确的properties配置文件 
aaa=1\ 
    11 

bb    =     222
 
#格式良好的properties文件 
aaa=111 
bbb=222
 
二、解读java.util.Properties类
 
1、Properties类的层次结构
java.lang.Object
  java.util.Dictionary<K,V>
      java.util.Hashtable<Object,Object>
          java.util.Properties
 
从层次机构看,Properties类实现了Map接口,因为HashTable实现了Map接口,因此Properties类本质上是一种简单的Map容器。
实际上,Properties类本身表示了对一种Map结构的操作。properties文件本身就表示了一个“键值对”的集合。因此,Properties类属于集合容器的家族,在使用前应该创建一个Properties的容器,实际上就是创建一个默认不带参数的Properties对象。以后通过别的方式给里面添加“键值对”。
 
2、properties文件与Properties类的关系
通过properties文件可以填充Properties类。
也可以通过xml文件来填充Properties类。
可以通过绝对路径方式加载Properties文件信息,也可以使用相对路径加载。
 
三、实践
 
1、以绝对相对路径方式加载properties文件信息。
2、将Properties对象持久化到一个properties文件或者一个xml文件中。
3、修改并持久化properties文件。
 
测试代码:
 
测试的properties文件:
#格式良好的properties文件 
aaa=111 
bbb=222
 
测试类:
package stu; 

import java.io.*; 
import java.util.Properties; 

/** 
* Properties类测试 
* User: xiaohui 
* Date: 2008-11-4 21:04:54 
*/
 
public class TestProperties { 
        public static void main(String args[]) throws IOException { 
                testProperties(); 
                test1(); 
        } 

        public static void testProperties() throws IOException { 
                System.out.println("------------testProperties-------------"); 
                //将properties文件加载到输入字节流中 
                InputStream is = new FileInputStream("D:\\myprojects\\lession4\\src\\stu\\ttt.properties"); 
                //创建一个Properties容器 
                Properties prop = new Properties(); 
                //从流中加载properties文件信息 
                prop.load(is); 
                //循环输出配置信息 
                for (Object key : prop.keySet()) { 
                        System.out.println(key + "=" + prop.get(key)); 
                } 

                //定义一个输出流 
                OutputStream os1 = new FileOutputStream("C:\\ttt.xml"); 
                OutputStream os2 = new FileOutputStream("C:\\ttt.properties"); 

                //从Properties对象导出导出到xml 
                prop.storeToXML(os1, "我从properties导出的XML配置文件"); 
                //从Properties对象导出properties文件 
                prop.store(os2, "我从properties导出的XML配置文件"); 

                is.close(); 
                os1.close(); 
                os2.close(); 

                //从xml加载配置信息,填充Properties容器 
                prop.loadFromXML(new FileInputStream("C:\\ttt.xml")); 
                //循环输出配置信息 
                System.out.println("我从导出的xml加载配置文件信息!"); 
                for (Object key : prop.keySet()) { 
                        System.out.println(key + "=" + prop.get(key)); 
                } 

                //修改Properties对象,并持久化到一个文件 
                prop.put("呵呵呵""嘎嘎嘎"); 
                OutputStream os3 = new FileOutputStream("C:\\ttt1.xml"); 
                prop.storeToXML(os3, "我从properties导出的XML配置文件"); 
                os3.close(); 
        } 

        /** 
         * 以相对路径方式加载properties文件 
         * 
         * @throws IOException 
         */
 
        public static void test1() throws IOException { 
                System.out.println("------------test1-------------"); 
                Properties p = new Properties(); 
                p.load(TestProperties.class.getResourceAsStream("/stu/ttt.properties")); 
                for (Object key : p.keySet()) { 
                        System.out.println(key + "=" + p.get(key)); 
                } 
        } 
}
 
 
运行结果:
------------testProperties------------- 
bbb=222 
aaa=111 
我从导出的xml加载配置文件信息! 
bbb=222 
aaa=111 
------------test1------------- 
bbb=222 
aaa=111 

Process finished with exit code 0
 
C:盘下写入的文件如下:
 
 
 
 
 
 
 
 扩展名为.properties的文件经常作为配置文件出现在我们的应用中,如Hibernate、log4j等就曾经或正在使用.properties作为核心配置文件。掌握此类文件的读写对我们理解配置文件的好处是显而易见的。下面将我们上课时所谈到的内容贴出来。 

一、java.util.Properties类 
    引用部分摘自jdk 1.5 API帮助文档。 
引用

    Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。 

    一个属性列表可包含另一个属性列表作为它的“默认值”;如果未能在原有的属性列表中搜索到属性键,则搜索第二个属性列表。 

    因为 Properties 继承于 Hashtable,所以可对 Properties 对象应用 put 和 putAll 方法。但强烈反对使用这两个方法,因为它们允许调用方插入其键或值不是 Strings 的项。相反,应该使用 setProperty 方法。如果在“有危险”的 Properties 对象(即包含非 String 的键或值)上调用 store 或 save 方法,则该调用将失败。 

    load 和 store 方法按简单的面向行的格式加载和存储属性。此格式使用 ISO 8859-1 字符编码。可以使用 Unicode 转义符来编写此编码中无法直接表示的字符;转义序列中只允许单个 'u' 字符。可使用 native2ascii 工具对属性文件和其他字符编码进行相互转换。 
    loadFromXML(InputStream) 和 storeToXML(OutputStream, String, String) 方法按简单的 XML 格式加载和存储属性。默认使用 UTF-8 字符编码,但如果需要,可以指定某种特定的编码。XML 属性文档具有以下 DOCTYPE 声明: 
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> 
注意,导入或导出属性时不访问系统 URI (http://java.sun.com/dtd/properties.dtd);该系统 URI 仅作为一个惟一标识 DTD 的字符串。 


二、properties.dtd 
properties.dtd的定义如下: 
引用

<?xml version="1.0" encoding="UTF-8"?> 

<!-- DTD for properties --> 

<!ELEMENT properties ( comment?, entry* ) > 

<!ATTLIST properties version CDATA #FIXED "1.0"> 

<!ELEMENT comment (#PCDATA) > 

<!ELEMENT entry (#PCDATA) > 

<!ATTLIST entry key CDATA #REQUIRED> 
 

通过Properties API读写的xml文档应该遵循此DTD的定义。 

三、常用方法 
    以下方法说明来自jdk 1.5 API帮助文档,详细解释请查看JDK API帮助文档。 
  • public String getProperty(String key):用指定的键在此属性列表中搜索属性。
  • public String getProperty(String key, String defaultValue):用指定的键在属性列表中搜索属性。如果在属性列表中未找到该键,则接着递归检查默认属性列表及其默认值。如果未找到属性,则此方法返回默认值变量。
  • public void setProperty(String key, String value):调用 Hashtable 的方法 put。
  • public void load(InputStream inStream) throws IOException:从输入流中读取属性列表(键和元素对)。   
  • public void loadFromXML(InputStream in)throws IOException,     InvalidPropertiesFormatException :将指定输入流中由 XML 文档所表示的所有属性加载到此属性表中。 
  • public void store(OutputStream out,String comments)throws IOException:将此 Properties 表中的属性列表(键和元素对)写入输出流。此方法适合使用 load 方法加载到 Properties 表中的格式。
  • public void loadFromXML(InputStream in)throws IOException, InvalidPropertiesFormatException:将指定输入流中由 XML 文档所表示的所有属性加载到此属性表中。
  • public void storeToXML(OutputStream os,String comment)throws IOException:发出一个表示此表中包含的所有属性的 XML 文档。
java读取properties文件的六种方法 

使用j2se api读取properties文件的六种方法

1。使用java.util.properties类的load()方法
示例: inputstream in = lnew bufferedinputstream(new fileinputstream(name)) 
properties p = new properties() 
p.load(in) 

2。使用java.util.resourcebundle类的getbundle()方法
示例: resourcebundle rb = resourcebundle.getbundle(name locale.getdefault()) 

3。使用java.util.propertyresourcebundle类的构造函数
示例: inputstream in = new bufferedinputstream(new fileinputstream(name)) 
resourcebundle rb = new propertyresourcebundle(in) 

4。使用class变量的getresourceasstream()方法
示例: inputstream in = jproperties.class.getresourceasstream(name) 
properties p = new properties() 
p.load(in) 

5。使用class.getclassloader()所得到的java.lang.classloader的getresourceasstream()方法
示例: inputstream in = jproperties.class.getclassloader().getresourceasstream(name) 
properties p = new properties() 
p.load(in) 

6。使用java.lang.classloader类的getsystemresourceasstream()静态方法
示例: inputstream in = classloader.getsystemresourceasstream(name) 
properties p = new properties() 
p.load(in) 

补充

servlet中可以使用javax.servlet.servletcontext的getresourceasstream()方法
示例:inputstream in = context.getresourceasstream(path) 
properties p = new properties() 
p.load(in) 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章