配置文件是程序经常使用的东西,毕竟硬编码会使应用程序丧失很多的灵活性。Java应用程序中properties是一种比较常见的配置文件,Java系统也内置了Properties
类来完成properties文件的读写操作;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22/**
* 无参构造方法
*/
//Properties prop=new Properties();
/**
* 指定一个基础properties集合
* 获取值时,首先在当前properties集合查找;
* 如果未找到,则在基础properties集合中查找。
* 通过这种构造方式可以形成一个查找链,获取时进行逐级查找。
*/
//Properties prop=new Properties(defaults);
/**
* 加载properties配置文件
*/
//prop.load(streamOrReader);
/**
* 加载XML配置文件
*/
//prop.loadFromXML(stream);
properties文件书写规则
- 键与值使用
=
或:
分割,原则上每行写一个键值对,如果要延伸到多行需要在行尾加\
- 第一次出现的
=
或:
会作为键值分割符,其后出现的=
或:
可以转义也可以不转义 - 键前后以及值前部的空白字符会被忽略,如果要保留空格需要在空格前加转义字符
\
properties文件中使用中文
大部分IDE创建的properties文件默认编码都是ISO8859-1
,因此文件内不能书写中文。如果要书写中文建议将文件编码改为UTF-8
,这样文件内注释书写中文完全没有问题。但如果值内含有中文取出时会乱码,这是因为Properties
类处理properties文件时默认都是使用ISO8859-1
。要解决此问题,可以使用native2ascii
工具对内容进行转码,也可以对取出的内容使用new String(value.getBytes("ISO8859-1"),"UTF-8")
进行编码转换,此时内容即可正常展示。
XML配置文件
Properties
不仅能加载properties文件还能通过loadFromXML
方法加载XML文件。相对properties文件来说XML文件默认使用UTF-8
编码,没有中文乱码的问题,书写中文比较方便,但其不如properties文件简洁。XML文件书写格式如下:1
2
3
4
5
6
7
8
9
10
<properties>
<comment>这是对整个文件的说明</comment>
<entry key="key1">value1</entry>
<!-- 普通注释 -->
<entry key="key2">value2</entry>
<entry key="key3">
<![CDATA[value3]]>
</entry>
</properties>
配置文件加载问题
一般来说加载配置文件只要书写格式符合要求,文件路径也没有弄错,加载是不会出现问题的。但平时还是经常听人说,文件明明存在路径也没有写错,格式也没问题;甚至还有自己运行没问题,换其他地方运行就报错的诡异问题。如果遇到这种问题,一般来说是配置文件的加载方式造成的,请注意以下几种加载方式的区别(通过类加载器加载文件可以从jar读取文件,普通的文件流无法读取jar包内的文件):1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17/**
* 相对路径从类所在包加载文件,绝对路径(以/开头)从类路径根路径加载文件,不能加载jar包内的文件。
*/
Properties prop1=new Properties();
prop1.load(new FileInputStream(new File(PropertiesTest.class.getResource("config.properties").getFile())));
/**
* 相对路径从类所在包加载文件,绝对路径(以/开头)从类路径根路径加载文件,可以加载jar包内的文件。
*/
Properties prop2=new Properties();
prop2.load(PropertiesTest.class.getResourceAsStream("config.properties"));
/**
* 相对路径从类路径根路径加载文件,不支持绝对路径,可以加载jar包内的文件。
*/
Properties prop3=new Properties();
prop3.load(PropertiesTest.class.getClassLoader().getResourceAsStream("config.properties"));
国际化与资源绑定
国际化是另一个使用properties文件的重要场景。Java通过一组properties语言文件来为应用提供国际化能力,这样你可以编写独立于语言环境的应用程序,也可以轻松支持新的语言环境。通过如下几步操作你的应用将获得这种能力:
- 创建一组语言文件(语言文件命名格式为:文件名_语言编码.properties),每个语言文件对应一个语言环境。
使用资源绑定类
ResourceBundle
加载语言文件。1
2
3
4
5
6/**
* 路径从类路径根部开始计算,不需要也不能以/开始。
* 可以使用包分割形式("language.message"),也可以使用路径分割形式("language.message")。
*/
private static final ResourceBundle APPLICATION_RESOURCE_BUNDLE =
ResourceBundle.getBundle("language.message");使用资源绑定对象的
getString
方法获取展示字符串来代替硬编码。1
2
3
4/**
* 通过这种方式获取的字符串会根据运行时语言环境的不同,从不同的语言文件查找对应值。
*/
String message = APPLICATION_RESOURCE_BUNDLE.getString("helloWorld");
JVM系统属性
Java系统内本身就存在着一个Properties
对象,该对象可以通过System.getProperties()
方法获取,对象内存储了JVM运行时系统信息。比较常用的属性有如下几个:
user.home
-> 用户家目录file.separator
-> 文件路径分隔符java.version
-> Java版本java.class.path
-> 类路径
另外,需要特别指出的是应用程序启动时,通过-Dkey=value
添加的启动参数,将会附加到JVM系统属性集合中。