一、properties文件
Properties文件是java中很常用的一種配置文件,文件后綴為“.properties”,屬文本文件,文件的內(nèi)容格式是“鍵=值”的格式,可以用“#”作為注釋,java編程中用到的地方很多,運(yùn)用配置文件,可以便于java深層次的解耦。
例如java應(yīng)用通過JDBC連接數(shù)據(jù)庫時(shí),可以把數(shù)據(jù)庫的配置寫在配置文件 jdbc.properties:
1
2
3
4
|
driver=com.mysql.jdbc.Driver jdbcUrl=jdbc:mysql://localhost:3306/ user user =root password =123456 |
這樣我們就可以通過加載properties配置文件來連接數(shù)據(jù)庫,達(dá)到深層次的解耦目的,如果想要換成oracle或是DB2,我們只需要修改配置文件即可,不用修改任何代碼就可以更換數(shù)據(jù)庫。
二、Properties類
java中提供了配置文件的操作類Properties類(java.util.Properties):
讀取properties文件的通用方法:根據(jù)鍵得到value
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/** * 讀取config.properties文件中的內(nèi)容,放到Properties類中 * @param filePath 文件路徑 * @param key 配置文件中的key * @return 返回key對(duì)應(yīng)的value */ public static String readConfigFiles(String filePath,String key) { Properties prop = new Properties(); try { InputStream inputStream = new FileInputStream(filePath); prop.load(inputStream); inputStream.close(); return prop.getProperty(key); } catch (Exception e) { e.printStackTrace(); System.out.println( "未找到相關(guān)配置文件" ); return null ; } } |
把配置文件以鍵值對(duì)的形式存放到Map中:
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
|
/** * 把.properties文件中的鍵值對(duì)存放在Map中 * @param inputStream 配置文件(inputstream形式傳入) * @return 返回Map */ public Map<String, String> convertPropertityFileToMap(InputStream inputStream) { try { Properties prop = new Properties(); Map<String, String> map = new HashMap<String, String>(); if (inputStream != null ) { prop.load(inputStream); Enumeration keyNames = prop.propertyNames(); while (keyNames.hasMoreElements()) { String key = (String) keyNames.nextElement(); String value = prop.getProperty(key); map.put(key, value); } return map; } else { return null ; } } catch (Exception e) { e.printStackTrace(); return null ; } } |
Properties類使用詳解
概述
Properties 繼承于 Hashtable。表示一個(gè)持久的屬性集,屬性列表以key-value的形式存在,key和value都是字符串。
Properties 類被許多Java類使用。例如,在獲取環(huán)境變量時(shí)它就作為System.getProperties()方法的返回值。
我們?cè)诤芏嘈枰苊庥簿幋a的應(yīng)用場(chǎng)景下需要使用properties文件來加載程序需要的配置信息,比如JDBC、MyBatis框架等。Properties類則是properties文件和程序的中間橋梁,不論是從properties文件讀取信息還是寫入信息到properties文件都要經(jīng)由Properties類。
常見方法
除了從Hashtable中所定義的方法,Properties定義了以下方法:
Properties類
下面我們從寫入、讀取、遍歷等角度來解析Properties類的常見用法:
寫入
Properties類調(diào)用setProperty方法將鍵值對(duì)保存到內(nèi)存中,此時(shí)可以通過getProperty方法讀取,propertyNames方法進(jìn)行遍歷,但是并沒有將鍵值對(duì)持久化到屬性文件中,故需要調(diào)用store方法持久化鍵值對(duì)到屬性文件中。
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
|
package cn.habitdiary; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Date; import java.util.Enumeration; import java.util.Properties; import junit.framework.TestCase; public class PropertiesTester extends TestCase { public void writeProperties() { Properties properties = new Properties(); OutputStream output = null ; try { output = new FileOutputStream( "config.properties" ); properties.setProperty( "url" , "jdbc:mysql://localhost:3306/" ); properties.setProperty( "username" , "root" ); properties.setProperty( "password" , "root" ); properties.setProperty( "database" , "users" ); //保存鍵值對(duì)到內(nèi)存 properties.store(output, "Steven1997 modify" + new Date().toString()); // 保存鍵值對(duì)到文件中 } catch (IOException io) { io.printStackTrace(); } finally { if (output != null ) { try { output.close(); } catch (IOException e) { e.printStackTrace(); } } } } } |
讀取
下面給出常見的六種讀取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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
package cn.habitdiary; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.Locale; import java.util.Properties; import java.util.PropertyResourceBundle; import java.util.ResourceBundle; /** * 讀取properties文件的方式 * */ public class LoadPropertiesFileUtil { private static String basePath = "src/main/java/cn/habitdiary/prop.properties" ; private static String path = "" ; /** * 一、 使用java.util.Properties類的load(InputStream in)方法加載properties文件 * * @return */ public static String getPath1() { try { InputStream in = new BufferedInputStream( new FileInputStream( new File(basePath))); Properties prop = new Properties(); prop.load(in); path = prop.getProperty( "path" ); } catch (FileNotFoundException e) { System.out.println( "properties文件路徑書寫有誤,請(qǐng)檢查!" ); e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return path; } /** * 二、 使用java.util.ResourceBundle類的getBundle()方法 * 注意:這個(gè)getBundle()方法的參數(shù)只能寫成包路徑+properties文件名,否則將拋異常 * * @return */ public static String getPath2() { ResourceBundle rb = ResourceBundle .getBundle( "cn/habitdiary/prop" ); path = rb.getString( "path" ); return path; } /** * 三、 使用java.util.PropertyResourceBundle類的構(gòu)造函數(shù) * * @return */ public static String getPath3() { InputStream in; try { in = new BufferedInputStream( new FileInputStream(basePath)); ResourceBundle rb = new PropertyResourceBundle(in); path = rb.getString( "path" ); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return path; } /** * 四、 使用class變量的getResourceAsStream()方法 * 注意:getResourceAsStream()方法的參數(shù)按格式寫到包路徑+properties文件名+.后綴 * * @return */ public static String getPath4() { InputStream in = LoadPropertiesFileUtil. class .getResourceAsStream( "cn/habitdiary/prop.properties" ); Properties p = new Properties(); try { p.load(in); path = p.getProperty( "path" ); } catch (IOException e) { e.printStackTrace(); } return path; } /** * 五、 * 使用class.getClassLoader()所得到的java.lang.ClassLoader的 * getResourceAsStream()方法 * getResourceAsStream(name)方法的參數(shù)必須是包路徑+文件名+.后綴 * 否則會(huì)報(bào)空指針異常 * @return */ public static String getPath5() { InputStream in = LoadPropertiesFileUtil. class .getClassLoader() .getResourceAsStream( "cn/habitdiary/prop.properties" ); Properties p = new Properties(); try { p.load(in); path = p.getProperty( "path" ); } catch (IOException e) { e.printStackTrace(); } return path; } /** * 六、 使用java.lang.ClassLoader類的getSystemResourceAsStream()靜態(tài)方法 * getSystemResourceAsStream()方法的參數(shù)格式也是有固定要求的 * * @return */ public static String getPath6() { InputStream in = ClassLoader .getSystemResourceAsStream( "cn/habitdiary/prop.properties" ); Properties p = new Properties(); try { p.load(in); path = p.getProperty( "path" ); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return path; } public static void main(String[] args) { System.out.println(LoadPropertiesFileUtil.getPath1()); System.out.println(LoadPropertiesFileUtil.getPath2()); System.out.println(LoadPropertiesFileUtil.getPath3()); System.out.println(LoadPropertiesFileUtil.getPath4()); System.out.println(LoadPropertiesFileUtil.getPath5()); System.out.println(LoadPropertiesFileUtil.getPath6()); } } |
其中第一、四、五、六種方式都是先獲得文件的輸入流,然后通過Properties類的load(InputStream inStream)方法加載到Properties對(duì)象中,最后通過Properties對(duì)象來操作文件內(nèi)容。
第二、三中方式是通過ResourceBundle類來加載Properties文件,然后ResourceBundle對(duì)象來操做properties文件內(nèi)容。
其中最重要的就是每種方式加載文件時(shí),文件的路徑需要按照方法的定義的格式來加載,否則會(huì)拋出各種異常,比如空指針異常。
遍歷
下面給出四種遍歷Properties中的所有鍵值對(duì)的方法:
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
|
/** * 輸出properties的key和value */ public static void printProp(Properties properties) { System.out.println( "---------(方式一)------------" ); for (String key : properties.stringPropertyNames()) { System.out.println(key + "=" + properties.getProperty(key)); } System.out.println( "---------(方式二)------------" ); Set<Object> keys = properties.keySet(); //返回屬性key的集合 for (Object key : keys) { System.out.println(key.toString() + "=" + properties.get(key)); } System.out.println( "---------(方式三)------------" ); Set<Map.Entry<Object, Object>> entrySet = properties.entrySet(); //返回的屬性鍵值對(duì)實(shí)體 for (Map.Entry<Object, Object> entry : entrySet) { System.out.println(entry.getKey() + "=" + entry.getValue()); } System.out.println( "---------(方式四)------------" ); Enumeration<?> e = properties.propertyNames(); while (e.hasMoreElements()) { String key = (String) e.nextElement(); String value = properties.getProperty(key); System.out.println(key + "=" + value); } } |
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://www.cnblogs.com/janson071/p/10082778.html