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

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 = localhost
databaseName = myd
dbUserName = 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 供应商的 URL
java.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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值