NCNC

WTGGT,TTGG

张忠良ID:sunjavaduke
90037次访问,排名936好友0人,关注者2
优于别人,并不高贵,真正的高贵是优于昨天的自己
这个世界上最伟大的事情并不是已经取得的成就,而是前进的方向
sunjavaduke的文章
原创 9 篇
翻译 39 篇
转载 1 篇
评论 0 篇
sunjavaduke的公告
Contact me
最近评论
文章分类
收藏
    相册
    vic
    Favorite
    ASF
    存档
    订阅我的博客
    XML聚合  FeedSky

    转载 Load Property From XML收藏

    新一篇: Unknown Source in Log4j

     
    本文摘自IBM DW,如有转载,请声明!
    从XML文件中加载属性
    Properties类是一个古老的,大约从Java编程开始到现在就没有多大变化的类。Java 5.0的发布对这个类做了增前,允许开发人员不仅仅可以使用它来指定在一行上的,以等号分隔的键-值对,也可以用XML文件来加载并且保存那些键-值对。在本部分有关Java 5.0新特性的部分,将介绍如何使用这些新特性。
    J2SE在1.5之前的版本要求开发人员必须直接使用XML解析器来加载一个配置文件或者存储设置。虽然这并不困难,并且解析器时平台的标准组件,但是这些额外的工作确实带来一些烦恼。更新后的java.util.Properties类提供了一种更容易的方法来加载和存储应用程序设置:loadFromXML(InputStream is)和storeToXML(OutputStream os,String comment)方法。
    属性的基本概念
    如果你对java.util.Properties还不熟悉,你可以使用它来存储一系列key-value在一个文件中,键和值是以等号来分隔,如下所示:
    foo=bar
    fu=baz
    如果上面的内容被加载到一个Properties对象中,就可以查找到两个键(foo和fu)和两个值(foo的值bar和fu的值baz)。这个类支持Unicode字符串,通过使用\u,这里唯一需要注意的是所有的内容都被看作是一个String。
    下面的代码展示了如何加载属性文件,并显示出键和值的集合。load()方法接受一个文件的InputStream参数,然后每一个key-value都被添加到Properties实例中。接下来就可以通过使用list()方法来显示所有的属性或者通过getProperty()方法来获取单个的属性。
    package org.ly;
    import java.util.*;
    import java.io.*;
    publicclass LoadSample {
             publicstaticvoid main(String args[]) throws Exception {
                       Properties prop = new Properties();
                       FileInputStream fis = new FileInputStream("sample.properties");
                       prop.load(fis);
                       prop.list(System.out);
                       System.out.println("\nThe foo property: " + prop.getProperty("foo"));
             }
    }
    执行这个类,执行结果如下:
    -- listing properties --
    fu=baz
    foo=bar
     
    The foo property: bar
     
    注意list()方法所列出的key-value列表的顺序和输入文件的内容并不相同。Properties类将key-value存储在一个hashtable中(实际上是一个Hashtable的子类),所以不保证顺序。
    XML属性文件
    这些对你来说都不是新的,这就是Properties类的以往的(5.0之前)工作方式。新的特性是从一个XML文件中加载一个属性的集合。下面是一个XML属性文件的文档类型定义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>
    如果你对XML DTD不感兴趣,基本上来说,一个<properties>标签包含一个<comment>标签,接下来是任意数量的<entry>标签。对于每个<entry>标签,需要由一个key属性,而entry的内容就是它(key)的值。下面的属性文件就是XML版本的属性文件:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
    <comment>Hi</comment>
    <entry key="foo">bar</entry>
    <entry key="fu">baz</entry>
    </properties>
           从从XML版本的属性文件中读取属性和以前的方式差不多:
    package org.ly;
    import java.util.*;
    import java.io.*;
    publicclass LoadSampleXML {
             publicstaticvoid main(String args[]) throws Exception {
                       Properties prop = new Properties();
                       FileInputStream fis = new FileInputStream("sample.xml");
                       prop.loadFromXML(fis);
                       prop.list(System.out);
                       System.out.println("\nThe foo property: " + prop.getProperty("foo"));
             }
    }
           运行这个程序,得到的输出和之前的输出时一样的。
           保存XML属性
           另外一个关于Properties类的新的功能时保存属性到XML格式的文件。store()方法还和以前一样创建一个文件,现在可以使用storeToXML()方法来生成一个文件,如下面代码所示。值需要传递一个OutputStream对象和一个String(作为注释)就可以了。
    package org.ly;
    import java.io.FileOutputStream;
    import java.util.Properties;
    publicclass StoreXML {
             publicstaticvoid main(String args[]) throws Exception {
                       Properties prop = new Properties();
                       prop.setProperty("one-two", "buckle my shoe");
                       prop.setProperty("three-four", "shut the door");
                       prop.setProperty("five-six", "pick up sticks");
                       prop.setProperty("seven-eight", "lay them straight");
                       prop.setProperty("nine-ten", "a big, fat hen");
                       FileOutputStream fos = new FileOutputStream("rhyme.xml");
                       prop.storeToXML(fos, "Rhyme");
                       fos.close();
             }
    }
    运行上面的程序生成的文件的内容如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
    <comment>Rhyme</comment>
    <entry key="seven-eight">lay them straight</entry>
    <entry key="five-six">pick up sticks</entry>
    <entry key="nine-ten">a big, fat hen</entry>
    <entry key="three-four">shut the door</entry>
    <entry key="one-two">buckle my shoe</entry>
    </properties>
           总结
           现在可以选择使用XML文件还是以前的a=b类型的文件。从占用内存的角度来看,以前的方式当然是相对轻量级的。然而,由于XML的普遍使用,不仅仅是提供给Properties对象使用。可以通过查看私有的XMLUtil类来获取更多关于XML解析的信息。
     
    关于系统属性和安全策略
    Java应用程序运行时,特别是需要在跨平台工作环境下运行时,需要确定操作系统类型、用户JDK版本和用户工作目录等随工作平台变化的信息,来保证程序正确运行。一般情况下,可以利用JDK提供的系统属性类(Properties)中的方法,快速地获取工作环境信息。另外,程序开发人员还可以定义与应用程序相关的系统属性文件,在用户程序执行过程中动态地加载程序员定义的属性文件来控制程序运行。
    通过对系统属性类的分析,结合实际例子介绍如何定义系统属性文件,并讨论安全策略文件的定义。 
    属性类 Java Properties类的继承关系如下: 
    java.lang.Object 
    +--java.util.Dictionary 
    +--java.util.Hashtable 
    +--java.util.Properties 
    在应用程序开始执行时,程序首先读取系统的默认属性。如果定义了用户属性文件,则应用程序加载该属性文件。程序运行过程中可以根据执行情况动态地修改属性定义,并在程序结束运行前,保存属性文件。 
    获取属性的方法: 
    ●contains(Object value)containsKey(Object key):如果给定的参数或属性关键字在属性表中有定义,该方法返回True,否则返回False 
    ●getProperty(String key)getProperty(String key, String default):根据给定的属性关键字获取关键字值; 
    ●list(PrintStream s)list(PrintWriter w) 在输出流中输出属性表内容; 
    ●size():返回当前属性表中定义的属性关键字个数。 
    设置属性的方法: 
    ●put(Object key, Object value) :向属性表中追加属性关键字和关键字的值; 
    ●remove(Object key) :从属性表中删除关键字。 
    获取系统属性 
    系统属性是指与用户程序相关的操作系统配置信息以及软件信息。通常与用户程序相关的属性关键字包括: 
    ●file.separator : 文件分隔符, Windows环境下为“"Unix环境下为“/”
    ●user.home :用户主目录;
    ●java.home Java实时运行环境的安装目录;
    ●java.ext.dirs JDK的安装目录;
    ●os.name :操作系统名称;
    ●user.name :用户登录名称;
    ●os.version :操作系统版本;
    ●path.separator :当前操作系统的路径分隔符;
    ●user.dir :当前用户程序所在目录。
    下面结合例子说明获取系统属性的方法。
    /*getSystemProperties.java*/ 
    import java.util.Properties; 
    public class getSystemProperties
    public static void main(String args[]) 
    //通过获得系统属性构造属性类 prop
    Properties prop = new Properties(System.getProperties() );
    //在标准输出中输出系统属性的内容
    prop.list(System.out);
    //根据获取的系统属性确定程序执行流程
    ……
    }
    上述程序执行后,在Windows环境中产生类似如下的输出:
    user.home=C:WIN95
    java.home=D:JDK1.2JRE
    java.ext.dirs=D:JDK1.2
    os.name=Windows 95
    user.name=Office
    java.vm.name=Classic VM
    os.version=4.10
    path.separator=;
    file.separator=
    user.dir=D:JavaTest
    属性文件的操作方法
    Java程序开发人员可以通过定义属性文件来设置程序运行的参数。属性文件是程序外部文件,在应用程序初始运行时,可以通过读取属性文件来获取有关程序运行的参数。例如,在程序运行时需要在程序外部控制程序的执行流程,这时可以通过定义属性文件的方法达到目的。下面结合例子说明属性文件的操作方法:
    /PropertyFile.java
    //引入相关类
    import java.io.
    import java.util.Properties; 
    public class PropertyFile 
    {
    //定义文件输入和输出流
    static FileInputStream fis;
    static FileOutputStream fos;
    public static void main(String args[])
    //生成新的属性对象
    Properties prop = new Properties();
    try
    //生成文件输入和输出流,输入流指向用户已经定义的属性文件,输出流指向由应用程
    新定义的属性文件
    fis = new FileInputStream (“firstProp.txt”);
    fos = new FileOutputStream (“secondProp.txt”);
    }
    catch(FileNotFoundException e)
    {
    System.out.println(“Cannot create the file stream”);
    }
    try
    {
    //从输入文件加载系统属性
    prop.load(fis);
    //根据程序执行情况更改属性关键字的值
    prop.put(“Switch”,“1”);
    //输出新属性文件secondProp.txt
    prop .save ( fos ,“-- a new properties file”);
    }
    catch(IOException e)
    {
    System.out.println(“Exception in repleace the keyword”);
    }
    }
    }
    在程序执行之前,用户必须首先定义属性文件firstProp.txt,该文件内容如下:
    Switch= 0
    Version= 1.0
    Directory= JavaTest
    程序运行后,输出新的属性文件secondProp.txt,该文件内容如下(注意观察两个文件关键字Switch内容的区别):
    #--a new properties file--
    Sun Mar 11 21:22:40 CST 2001
    Switch= 1
    Version= 1.0
    Directory= JavaTest
    从上例可以看出,通过JDK提供的属性类Properties可以方便地在程序外部对应用程序的执行流程进行控制,从而简化了编程难度,使程序流程可控性更好。 
    安全策略文件
    Java提供的应用程序环境的安全策略,使得不同的代码对系统资源拥有不同的访问许可。Java应用程序安全策略由Policy对象来表达,通过定义安全策略文件来实现。Java 1.2的安全策略文件分为三级:系统安全策略文件、用户安全策略文件和缺省安全策略文件。当Java应用程序启动后,按照先后顺序加载安全策略内容。下面结合典型的安全策略文件内容对安全策略文件的定义进行说明: 
    grant 
    //对系统和用户目录设置的权限
    permission java.util.PropertyPermission “user.dir”,“read”; 
    permission java.util.PropertyPermission “user.home”,“read”;
    permission java.util.PropertyPermission “java.home”,“read”;
    permission java.util.PropertyPermission “java.class.path”,“read”;
    permission java.util.PropertyPermission “user.name”,“read”;
    //其他安全策略内容
    }; 
    上述安全策略文件定义了应用程序对用户目录、用户登录目录、JDK安装目录、用户名称等系统内容具有读的权限。
     

    发表于 @ 2008年03月27日 00:05:00|编辑

    旧一篇: Java Enum

    评论:没有评论。

    Csdn Blog version 3.1a
    Copyright © sunjavaduke