java.util.Properties

The Properties class represents a persistent set of properties. The Properties can be saved to a stream or loaded from a stream. Each key and its corresponding value in the property list is a string. - - - - Java™ SE 8 API

Java 里通过 Properties 类来读写 .properties 配置文件

.properties 文件

# 代表注释信息,其配置内容以键值对的形式出现,并且 String key, String value

1
2
3
#Fri Jun 16 14:48:31 CST 2017
school=\u6D59\u6C5F\u5927\u5B66\u57CE\u5E02\u5B66\u9662
student=denglyan

school 的值是中文,这里是 Unicode 编码的形式,在 IDEA 中想要以中文的形式浏览,需要进行以下操作:

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import java.io.*;
import java.util.Map;
import java.util.Properties;

/**
* Created by denglyan on 2017/6/16.
*/

public class Config {

public Properties getConfig(String path) {

try (InputStream inputStream = new BufferedInputStream(new FileInputStream(path))) {

Properties properties = new Properties();
properties.load(inputStream);

return properties;

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

return null;
}

public void setConfig(Properties properties, Map<String, String> map, String path, String comments, boolean append) {

try (OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(path, append))) {

if (properties == null) {
properties = new Properties();
}

for (String key : map.keySet()) {
properties.setProperty(key, map.get(key));
}

properties.store(outputStream, comments);

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

源码分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class Properties extends Hashtable<Object,Object> {

// 用于 Java 的序列化机制
private static final long serialVersionUID = 4112578634029874840L;

// 当 key 找不到值时,从 defaults 里面找
protected Properties defaults;

public Properties() {
this(null);
}

public Properties(Properties defaults) {
this.defaults = defaults;
}

// 由于继承 Hashtable,所以 key 和 value 不能为空
// 该方法有一个返回值,当 key 不存在时,返回 null
// 当 key 存在时,返回 key 对应的旧值
public synchronized Object setProperty(String key, String value) {
return put(key, value);
}

// 通过 Hashtable 的 get 方法查找值,若找不到,返回 null
// 再判断查找得到的值,是否为 String 类的对象
// 最后,若值为 null,且 defaults 存在,则从 defaults 里面继续查找
public String getProperty(String key) {
Object oval = super.get(key);
String sval = (oval instanceof String) ? (String)oval : null;
return ((sval == null) && (defaults != null)) ? defaults.getProperty(key) : sval;
}

// 在上一个方法的基础上,增加了一个 defaultValue 值
// 若查找不到,则返回 defaultValue
public String getProperty(String key, String defaultValue) {
String val = getProperty(key);
return (val == null) ? defaultValue : val;
}

}