Java读取Properties文件的几种方式

前言

在Spring的时候,通过XML配置文件的方式进行配置数据库连接池的时候,就会使用==context:property-placeholder==标签进行读取,在这里呢,也是通过Java几种比较基础的方式来读取Properties文件。

在开始之前,说下目前比价常用的几种方式:

1. 使用java.util.Properties类,可以使用它的load方法加载inputStream字节流。
2. 使用java.util.ResourceBundle类来读取。

使用Properties类

Properties类继承自Hashtable,而Hashtable是实现了Map接口的,所以对Properties类的操作和Map有些相似。

使用Properties来加载.properties文件的主要关键是在于load方法。而load方法需要的是InputStream流。

这里比较常用的流的获取有以下几种:

  1. 使用当前类的ClassLoader()的getResourceAsStream(),getResourcesAsStream返回一个InputStream。
  2. 使用ClassLoader类的getSystemResourceAsStream(),该方法也返回一个InputStream。
  3. 使用文件输入流的方式。

具体示例如下,为了方便,我直接使用的log4j.properties。文件位置如下:
位置图

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
49
50
/**
* 单独抽取的方法,用户检测能否正确操纵Properties
*
* @param inputStream
* @throws IOException 为了排版美观,直接抛出异常
*/
public void printKeyValue(InputStream inputStream) throws IOException {
Properties properties = new Properties();
properties.load(inputStream);
Set<Object> keys = properties.keySet();
for (Object key : keys) {
System.out.println(key + " = " + properties.get(key));
}
}

/***
* 从当前的类加载器的getResourcesAsStream来获取.
* 使用Class.class.getClassLoader().getResourcesAsStream()进行获取的时候,所填写的路径只能为项目的绝对路径
* @throws IOException
*/
@Test
public void getPropertiesFromResourceAsStream() throws IOException {
InputStream resourceAsStream = PropertiesUtils.class.getClassLoader().getResourceAsStream("com/dimple/getproperityfile/mylog4j.properties");
printKeyValue(resourceAsStream);
}

/***
* 从文件中获取,使用InputStream字节
* 主要是需要加上src这个文件夹名。。。路径配置需要精确到绝对地址级别
* 什么意思,就是如果这个mylog4j文件在com/dimple/getproperityfile/mylog4j.properties下,而这个com文件夹
* 又在src目录下,那么写的时候需要加上这个src,这样的相对路径+项目地址能够构成一个完整的访问地址即可
* @throws IOException
*/
@Test
public void getPropertiesFromFile() throws IOException {
InputStream inputStream = new FileInputStream(new File("src/com/dimple/getproperityfile/mylog4j.properties"));
printKeyValue(inputStream);
}

/**
* 使用Class类的getSystemResourceAsStream方法
* 和使用当前类的ClassLoader是一样的
*
* @throws IOException
*/
@Test
public void getPropertiesFromClassLoader() throws IOException {
InputStream systemResourceAsStream = ClassLoader.getSystemResourceAsStream("com/dimple/getproperityfile/mylog4j.properties");
printKeyValue(systemResourceAsStream);
}

使用ResourceBundle类

使用ResourcesBundle类也两种方法可以读取到配置文件

  1. 使用类ResourcesBundle的getBundle方法加载properties文件。
  2. 使用其派生类PropertyResourceBundle(),通过传入一个InputStream来读取数据。

代码如下:

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
/***
* 使用java.util.ResourceBundle类来加载properties文件,注意不需要带上后缀名。
*/
@Test
public void getPropertiesFromResourceBundle() {
ResourceBundle resourceBundle = ResourceBundle.getBundle("com/dimple/getproperityfile/mylog4j");
Enumeration<String> keys = resourceBundle.getKeys();
while (keys.hasMoreElements()) {
String s = keys.nextElement();
System.out.println(s + " = " + resourceBundle.getString(s));
}
}

/**
* 使用InputStream流来进行操作ResourceBundle,获取流的方式由以上几种。
* @throws IOException
*/
@Test
public void getPropertiesFromResourceBundleInputStream() throws IOException {
InputStream systemResourceAsStream = ClassLoader.getSystemResourceAsStream("com/dimple/getproperityfile/mylog4j.properties");
ResourceBundle resourceBundle = new PropertyResourceBundle(systemResourceAsStream);
Enumeration<String> keys = resourceBundle.getKeys();
while (keys.hasMoreElements()) {
String s = keys.nextElement();
System.out.println(s + " = " + resourceBundle.getString(s));
}
}

总结

以上代码的的方法具体有什么用已经表明了,遇到的问题已经不是代码问题了。而是路径。对于这个路径,相对路径,绝对路径,项目路径,这个路径确实让我有些头痛,在File的Test代码哪里,文件路径近乎是我试出来的。当然读者可能会说,直接拿鼠标去点,能点进去的就是对的,但是,在File那里,我没有加src,是可以点击去的,但是项目报错提示FileNotFound,加上src就能正常访问,但是点不进去。这个原因是因为IDEA这里,有一个工程路径的说法,工程路径并不包含src,而代码是写在src下的,所以导致最后的绝对路径不可达,所以报错。

-------------The End-------------

本文标题:Java读取Properties文件的几种方式

文章作者:Dimple

发布时间:2018年08月16日 - 03:08

最后更新:2018年09月17日 - 20:09

原始链接:http://www.bianxiaofeng.com/2018/08/16/2018-08-16-03-58-02/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

na,给我一个棒棒糖!
0%