一、properties文件
Properties文件是java中很常用的一種配置文件,文件后綴為“.properties”,屬文本文件,文件的內容格式是“鍵=值”的格式,可以用“#”作為注釋,java編程中用到的地方很多,運用配置文件,可以便于java深層次的解耦。
例如java應用通過JDBC連接數據庫時,可以把數據庫的配置寫在配置文件 jdbc.properties:
1
2
3
4
|
driver=com.mysql.jdbc.Driver jdbcUrl=jdbc:mysql://localhost:3306/ user user =root password =123456 |
這樣我們就可以通過加載properties配置文件來連接數據庫,達到深層次的解耦目的,如果想要換成oracle或是DB2,我們只需要修改配置文件即可,不用修改任何代碼就可以更換數據庫。
二、Properties類
java中提供了配置文件的操作類Properties類(java.util.Properties):
讀取properties文件的通用方法:根據鍵得到value
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/** * 讀取config.properties文件中的內容,放到Properties類中 * @param filePath 文件路徑 * @param key 配置文件中的key * @return 返回key對應的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( "未找到相關配置文件" ); return null ; } } |
把配置文件以鍵值對的形式存放到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文件中的鍵值對存放在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。表示一個持久的屬性集,屬性列表以key-value的形式存在,key和value都是字符串。
Properties 類被許多Java類使用。例如,在獲取環境變量時它就作為System.getProperties()方法的返回值。
我們在很多需要避免硬編碼的應用場景下需要使用properties文件來加載程序需要的配置信息,比如JDBC、MyBatis框架等。Properties類則是properties文件和程序的中間橋梁,不論是從properties文件讀取信息還是寫入信息到properties文件都要經由Properties類。
常見方法
除了從Hashtable中所定義的方法,Properties定義了以下方法:
Properties類
下面我們從寫入、讀取、遍歷等角度來解析Properties類的常見用法:
寫入
Properties類調用setProperty方法將鍵值對保存到內存中,此時可以通過getProperty方法讀取,propertyNames方法進行遍歷,但是并沒有將鍵值對持久化到屬性文件中,故需要調用store方法持久化鍵值對到屬性文件中。
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" ); //保存鍵值對到內存 properties.store(output, "Steven1997 modify" + new Date().toString()); // 保存鍵值對到文件中 } 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文件路徑書寫有誤,請檢查!" ); e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return path; } /** * 二、 使用java.util.ResourceBundle類的getBundle()方法 * 注意:這個getBundle()方法的參數只能寫成包路徑+properties文件名,否則將拋異常 * * @return */ public static String getPath2() { ResourceBundle rb = ResourceBundle .getBundle( "cn/habitdiary/prop" ); path = rb.getString( "path" ); return path; } /** * 三、 使用java.util.PropertyResourceBundle類的構造函數 * * @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()方法的參數按格式寫到包路徑+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)方法的參數必須是包路徑+文件名+.后綴 * 否則會報空指針異常 * @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()靜態方法 * getSystemResourceAsStream()方法的參數格式也是有固定要求的 * * @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對象中,最后通過Properties對象來操作文件內容。
第二、三中方式是通過ResourceBundle類來加載Properties文件,然后ResourceBundle對象來操做properties文件內容。
其中最重要的就是每種方式加載文件時,文件的路徑需要按照方法的定義的格式來加載,否則會拋出各種異常,比如空指針異常。
遍歷
下面給出四種遍歷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
|
/** * 輸出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(); //返回的屬性鍵值對實體 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); } } |
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://www.cnblogs.com/janson071/p/10082778.html