• Java&Xml教程(十)XML作为属性文件使用


    我们通常会将Java应用的配置参数保存在属性文件中,Java应用的属性文件可以是一个正常的基于key-value对,以properties为扩展名的文件,也可以是XML文件.
    在本案例中,將会向大家介绍如何通过Java程序输出这两种格式的属性文件,并介绍如何从classpath中加载和使用这两种属性文件。
    下面是案例程序代码:
    PropertyFilesUtil.java

    package com.journaldev.util;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    import java.util.Set;
    
    public class PropertyFilesUtil {
    
        public static void main(String[] args) throws IOException {
            String propertyFileName = "DB.properties";
            String xmlFileName = "DB.xml";
            writePropertyFile(propertyFileName, xmlFileName);
            readPropertyFile(propertyFileName, xmlFileName);
            readAllKeys(propertyFileName, xmlFileName);
            readPropertyFileFromClasspath(propertyFileName);
        }
    
        /**
         * read property file from classpath
         * @param propertyFileName
         * @throws IOException
         */
        private static void readPropertyFileFromClasspath(String propertyFileName) throws IOException {
            Properties prop = new Properties();
            prop.load(PropertyFilesUtil.class.getClassLoader().getResourceAsStream(propertyFileName));
            System.out.println(propertyFileName +" loaded from Classpath::db.host = "+prop.getProperty("db.host"));
            System.out.println(propertyFileName +" loaded from Classpath::db.user = "+prop.getProperty("db.user"));
            System.out.println(propertyFileName +" loaded from Classpath::db.pwd = "+prop.getProperty("db.pwd"));
            System.out.println(propertyFileName +" loaded from Classpath::XYZ = "+prop.getProperty("XYZ"));
    
        }
    
        /**
         * read all the keys from the given property files
         * @param propertyFileName
         * @param xmlFileName
         * @throws IOException 
         */
        private static void readAllKeys(String propertyFileName, String xmlFileName) throws IOException {
            System.out.println("Start of readAllKeys");
            Properties prop = new Properties();
            FileReader reader = new FileReader(propertyFileName);
            prop.load(reader);
            Set<Object> keys= prop.keySet();
            for(Object obj : keys){
                System.out.println(propertyFileName + ":: Key="+obj.toString()+"::value="+prop.getProperty(obj.toString()));
            }
            //loading xml file now, first clear existing properties
            prop.clear();
            InputStream is = new FileInputStream(xmlFileName);
            prop.loadFromXML(is);
            keys= prop.keySet();
            for(Object obj : keys){
                System.out.println(xmlFileName + ":: Key="+obj.toString()+"::value="+prop.getProperty(obj.toString()));
            }
            //Now free all the resources
            is.close();
            reader.close();
            System.out.println("End of readAllKeys");
        }
    
        /**
         * This method reads property files from file system
         * @param propertyFileName
         * @param xmlFileName
         * @throws IOException 
         * @throws FileNotFoundException 
         */
        private static void readPropertyFile(String propertyFileName, String xmlFileName) throws FileNotFoundException, IOException {
            System.out.println("Start of readPropertyFile");
            Properties prop = new Properties();
            FileReader reader = new FileReader(propertyFileName);
            prop.load(reader);
            System.out.println(propertyFileName +"::db.host = "+prop.getProperty("db.host"));
            System.out.println(propertyFileName +"::db.user = "+prop.getProperty("db.user"));
            System.out.println(propertyFileName +"::db.pwd = "+prop.getProperty("db.pwd"));
            System.out.println(propertyFileName +"::XYZ = "+prop.getProperty("XYZ"));
            //loading xml file now, first clear existing properties
            prop.clear();
            InputStream is = new FileInputStream(xmlFileName);
            prop.loadFromXML(is);
            System.out.println(xmlFileName +"::db.host = "+prop.getProperty("db.host"));
            System.out.println(xmlFileName +"::db.user = "+prop.getProperty("db.user"));
            System.out.println(xmlFileName +"::db.pwd = "+prop.getProperty("db.pwd"));
            System.out.println(xmlFileName +"::XYZ = "+prop.getProperty("XYZ"));
            //Now free all the resources
            is.close();
            reader.close();
            System.out.println("End of readPropertyFile");
        }
    
        /**
         * This method writes Property files into file system in property file
         * and xml format
         * @param fileName
         * @throws IOException
         */
        private static void writePropertyFile(String propertyFileName, String xmlFileName) throws IOException {
            System.out.println("Start of writePropertyFile");
            Properties prop = new Properties();
            prop.setProperty("db.host", "localhost");
            prop.setProperty("db.user", "user");
            prop.setProperty("db.pwd", "password");
            prop.store(new FileWriter(propertyFileName), "DB Config file");
            System.out.println(propertyFileName + " written successfully");
            prop.storeToXML(new FileOutputStream(xmlFileName), "DB Config XML file");
            System.out.println(xmlFileName + " written successfully");
            System.out.println("End of writePropertyFile");
        }
    
    }

    当运行这段代码时,writePropertyFile 方法会在生成上述两种格式的属性文件,并將文件存储在工程的根目录下。
    writePropertyFile 方法生成的两种属性文件内容:
    DB.properties

    #DB Config file
    #Fri Nov 16 11:16:37 PST 2012
    db.user=user
    db.host=localhost
    db.pwd=password

    DB.xml

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
    <comment>DB Config XML file</comment>
    <entry key="db.user">user</entry>
    <entry key="db.host">localhost</entry>
    <entry key="db.pwd">password</entry>
    </properties>

    需要注意的是comment元素,我们在使用prop.storeToXML(new FileOutputStream(xmlFileName), "DB Config XML file");这段代码时第二个参数传入的是注释内容,如果传入null,生成的xml属性文件將没有comment元素。
    控制台输出内容如下:

    Start of writePropertyFile
    DB.properties written successfully
    DB.xml written successfully
    End of writePropertyFile
    Start of readPropertyFile
    DB.properties::db.host = localhost
    DB.properties::db.user = user
    DB.properties::db.pwd = password
    DB.properties::XYZ = null
    DB.xml::db.host = localhost
    DB.xml::db.user = user
    DB.xml::db.pwd = password
    DB.xml::XYZ = null
    End of readPropertyFile
    Start of readAllKeys
    DB.properties:: Key=db.user::value=user
    DB.properties:: Key=db.host::value=localhost
    DB.properties:: Key=db.pwd::value=password
    DB.xml:: Key=db.user::value=user
    DB.xml:: Key=db.host::value=localhost
    DB.xml:: Key=db.pwd::value=password
    End of readAllKeys
    Exception in thread "main" java.lang.NullPointerException
        at java.util.Properties$LineReader.readLine(Properties.java:434)
        at java.util.Properties.load0(Properties.java:353)
        at java.util.Properties.load(Properties.java:341)
        at com.journaldev.util.PropertyFilesUtil.readPropertyFileFromClasspath(PropertyFilesUtil.java:31)
        at com.journaldev.util.PropertyFilesUtil.main(PropertyFilesUtil.java:21)
    

    这里报了空指针异常,原因是生成的文件保存在工程的根目录下面,而读取时是从classpath下读取,將上面生成的两个属性文件拷贝到src下再次运行程序即可。

  • 相关阅读:
    程序员职业规划
    SSH框架优缺点
    Servlet的生命周期,并说出Servlet和CGI的区别,Servlet与JSP的区别
    什么是J2EE,包括哪些规范!
    JS中定义类的方法
    audio.js – 随时随地,播放 HTML5 的声音
    jquery面试题里 缓存问题如何解决?
    产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复
    JAVA排序算法
    java面试题中常见的关于String类问题总结
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468333.html
Copyright © 2020-2023  润新知