您的位置:首页 > 运维架构

SE高阶(1):用于读写配置文件的特殊Map——Properties类

2017-04-25 22:45 453 查看

Properties类的特点和作用

Properties
 类表示了一个持久的属性集。
Properties
 可保存在流中或从流中加载。属性列表以键值对形式存储,key和value都是字符串。
一个属性列表可包含另一个属性列表作为它的“默认值”;如果未能在原有的属性列表中搜索到属性键,则搜索第二个属性列表。 
只要配置文件以key=value的形式来作为属性列表,Properties都可以进行读写。而且现在Properties也支持XML文件了。

使用注意点

Properties类实现了Map接口,可以使用put()来创建属性键值对,但因为允许放入不同类型key-value,尽量少使用,建议使用setProperty()。
Properties是属于Map体系,所以Properties输出的属性列表是无序的。
Properties输出属性列表有两种方法:list()和store(),store()方法的Stirng comments参数表示注释。当然也可以自己加注释,#注释语句。
Properties通过流写入文件时,节点流默认对文件内容进行覆盖,根据需求来确定是否允许附加内容。

Properties类方法

Properties方法作用描述
String getProperty(String key)

使用指定键获取对应的属性。
String getProperty(String key, String defaultValue)使用指定键获取对应的属性,找不到就使用默认值。
void list(PrintStream out)

将属性列表输出到指定的打印输出字节流中。
void list(PrintWriter
out)
将属性列表输出到指定的打印输出字符流中。
void load(InputStream inStream)从指定字节输入流中读取属性列表(键值对)。
void load(Reader reader)以行的格式从输入字符流中读取属性列表(键值对)。
void loadFromXML(InputStream in)将指定输入流中由 XML 文档所表示的所有属性加载到此属性表中。
Object setProperty(String key, String value)以键值对形式来设置属性。
Enumeration<?> propertyNames()返回属性列表中所有键的枚举。 
Set<String> stringPropertyNames()返回此属性列表中的键集。  
void store(OutputStream out, String comments)将该Properties的属性列表(键值对)写入输出流。 
void store(Writer writer, String comments)将Properties的属性列表(键值对)写入输出字符流。
void storeToXML(OutputStream os, String comment)输出一个包含所有属性的 XML 文档。
void storeToXML(OutputStream os, String comment, String encoding)使用指定编码输出一个包含所有属性的 XML 文档。 


Properties类的代码实例


1.两种方式把属性列表写入文件中

使用到的方法:setProperty()、list()和store()

[java] view
plain copy

 print?

Properties pro = new Properties();  

//key-value形式设置属性  

pro.setProperty("A", "AAA");  

pro.setProperty("G", "GGG");  

pro.setProperty("B", "BBB");  

pro.setProperty("C", "CCC");  

System.out.println(pro);  

FileOutputStream fos = new FileOutputStream("F:\\properites.txt");  

FileWriter fw = new FileWriter("F:\\properites.txt");  

PrintStream ps = new PrintStream(fos);  

pro.list(ps);//无注释  

pro.store(fw, "comments");//有注释  

      

list()和store()将属性键值对写入文件中,list()使用的是打印流作为参数,可以指定编码,但不能加注释。store()可以加注释,但注释是中文时则是显示Unicode格式。

2.读取配置文件

使用到的方法:load()、stringPropertyNames()

[java] view
plain copy

 print?

Properties pro = new Properties();  

        //指向一个属性文件  

        FileInputStream fis = new FileInputStream("F:\\properites.txt");  

        //加载属性文件  

        pro.load(fis);  

        //返回pro对象中的所有键集  

        Set<String> proStr = pro.stringPropertyNames();  

          

        //读取属性列表  

        //mode 1  

        for(String key : proStr) {  

            System.out.println(key + ":" + pro.getProperty(key));  

        }  

        //mode 2  

        Iterator<String> its = pro.stringPropertyNames().iterator();  

        while(its.hasNext()) {  

            String s = its.next();  

            System.out.println(s + "--" + pro.getProperty(s));  

        }  

使用stringPropertyNames()方法获取属性文件的所有键值,该方法会返回一个泛型声明的集合Set<String>,这样就可以直接使用,无需强制转换String。但除了该方法,如果用entrySet()和keySet()呢?下面给出实例。

3.使用entrySet()和keySet()来遍历属性列表

[java] view
plain copy

 print?

    //使用entrySet()遍历key-value  

    Iterator it = pro.entrySet().iterator();  

    while(it.hasNext()) {  

        Map.Entry obj = (Map.Entry)it.next();  

        System.out.println(obj.getKey() + "::" + obj.getValue());  

    }  

      

    //使用keySet()  

    System.out.println("--------------------------");  

    Iterator ite = pro.keySet().iterator();  

    while(ite.hasNext()) {  

        Object obj = ite.next();  

        System.out.println(obj + ":" + pro.getProperty((String) obj));  

    }  

//使用values()获取所有valueCollection<Object> values = pro.values();System.out.println(values);  

  

输出结果并不是按照属性文件中的顺序来的,而是无序的,而且这三个方法输出的列表顺序都是一致的。也不知道为什么会这样,所以建议使用stringProperyNames()。  


使用Properties来加载JDBC的例子

[java] view
plain copy

 print?

private static String username = null;  

    private static String password = null;  

    private static String url = null;  

   

    static {  

        String path = JdbcUtils.class.getClassLoader().getResource("db.properties").getPath();  

        Properties properties = new Properties();  

        try {  

            properties.load(new FileInputStream(path));  

            String driverClass = properties.getProperty("driver");  

            username = properties.getProperty("username");  

            password = properties.getProperty("password");  

            url = properties.getProperty("url");  

        } catch (Exception e) {  

            e.printStackTrace();  

            throw new ExceptionInInitializerError(e);  

        }  

    }  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息