使用java.util.Properties类读写配置文件

来源:互联网 发布:python进程和线程 编辑:程序博客网 时间:2024/05/17 23:47

J2SE 1.5以前的版本要求直接使用XML解析器来装载配置文件并存储设置,虽说也并非难事,相比java.util.Properties却要做额外的解析工作。而java.util.Properties类提供了更实用的方法: loadFromXML(InputStream in)和 load(InputStream inStream)
java.util.Properties是对properties这类配置文件的映射。支持key-value类型和xml类型两种。

主要涉及到以下方法

//加载/保存普通键值对文件load(InputStream inStream)store(OutputStream out, String comments) //加载/保存XML键值对文件loadFromXML(InputStream in)storeToXML(OutputStream os, String comment)//获取/设置键的值getProperty(String key)setProperty(String key, String value) //列出所有的键值对list(PrintStream out) 

key-value类型的配置文件大略长这样:

#测试环境配置:平台路径配置jstrd_home=D:/TMS2006/webapp/tms2006/WEB-INF/dbPort = localhostdatabaseName = myddbUserName = root

打头的是注释行,Properties会忽略注释。允许只有key没有value。

例如这样:

#测试环境配置:平台路径配置jstrd_home=D:/TMS2006/webapp/tms2006/WEB-INF/dbPort = databaseName

这种情况下,value会被set成null。

properties类实现了Map接口,所以很明显,他是用map来存储key-value数据,所以也注定存入数据是无序的,这个点需要注意。只能通过key的方式来get对应value。

针对key-value这种配置文件,是用load方法就能直接映射成map,非常简单好用。这种配置文件也是我们最重要碰到的配置文件,利用properties读取这类文件到内存一行代码就欧科,比自己解析强大多了,这点很赞。

使用普通方式加载
普通的方式文件一般以properties作为后缀如”sample.properties”,读取配置文件的大略代码如下:

import java.io.FileInputStream;import java.util.Properties;public class LoadSample {    public static void 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"));    }}

第六行的load方法直接生产一个内存map,第九行就能get到对应的value了,简单快捷。

这里的第七行list方法是一个输出方法,这边是输出到console,也可以输出到文件等,就能实现内存写入配置文件了。

比如这样:

//通过list 方法将Properties写入Properties文件import java.io.IOException;import java.io.File;import java.io.PrintStream;import java.util.Properties;public class Test {    public static void main(String[] args) {        try {            Properties p = new Properties();            p.setProperty("id", "dean");            p.setProperty("password", "123456");            PrintStream fW = new PrintStream(new File("e:\\test1.properties"));            p.list(fW);        } catch (IOException e) {            e.printStackTrace();        }    }}

这样就能把内存中的properties对象写入到文件中了。

另外一种配置形式是xml形式的,这种配置相对上面一种就少见一点。
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配置跟读取kv配置没差别,就是把load换成xml对应的loadFromXML方法,代码大略是这样:
复制代码

import java.io.FileInputStream;import java.util.Properties;public class LoadSampleXML {    public static void main(String args[]) throws Exception {        Properties prop = new Properties();        FileInputStream fis = new FileInputStream("sampleprops.xml");        prop.loadFromXML(fis);        prop.list(System.out);        System.out.println("\nThe foo property: " + prop.getProperty("foo"));    }}

把内存中的properties对象写入到xml文件中也和上面差不多,就是把list方法改成xml对应的storeToXML方法。

代码大略是这样:

import java.io.IOException;import java.io.File;import java.io.PrintStream;import java.util.Properties;public class Test {    public static void main(String[] args) {        Properties p = new Properties();        p.setProperty("id", "dean");        p.setProperty("password", "123456");        try {            PrintStream fW = new PrintStream(new File("e:\\test1.xml"));            p.storeToXML(fW, "test");        } catch (IOException e) {            e.printStackTrace();        }    }}

总的来说,虽然jdk中存在date类这种特别奇葩的类,但是这些不常用的工具类还是很方便使用的,要能用起来,在用得到的时候还是很能提高效率的。比自己写解析方便快捷多了。
有同学可能会对System.getProperty(“user.dir”)好奇,其实System是java.lang下的一个类,通过getProperty可以获取很多系统属性:

java.version Java 运行时环境版本java.vendor Java 运行时环境供应商java.vendor.url Java 供应商的 URLjava.home Java 安装目录java.vm.specification.version Java 虚拟机规范版本java.vm.specification.vendor Java 虚拟机规范供应商java.vm.specification.name Java 虚拟机规范名称java.vm.version Java 虚拟机实现版本java.vm.vendor Java 虚拟机实现供应商java.vm.name Java 虚拟机实现名称java.specification.version Java 运行时环境规范版本java.specification.vendor Java 运行时环境规范供应商java.specification.name Java 运行时环境规范名称java.class.version Java 类格式版本号java.class.path Java 类路径java.library.path 加载库时搜索的路径列表java.io.tmpdir 默认的临时文件路径java.compiler 要使用的 JIT 编译器的名称java.ext.dirs 一个或多个扩展目录的路径os.name 操作系统的名称os.arch 操作系统的架构os.version 操作系统的版本file.separator 文件分隔符(在 UNIX 系统中是“/”)path.separator 路径分隔符(在 UNIX 系统中是“:”)line.separator 行分隔符(在 UNIX 系统中是“/n”)user.name 用户的账户名称user.home 用户的主目录user.dir 用户的当前工作目录 
0 0