基于Properties類操作.properties配置文件方法總結(jié)
一、properties文件
Properties文件是java中很常用的一種配置文件,文件后綴為“.properties”,屬文本文件,文件的內(nèi)容格式是“鍵=值”的格式,可以用“#”作為注釋,java編程中用到的地方很多,運(yùn)用配置文件,可以便于java深層次的解耦。
例如java應(yīng)用通過(guò)JDBC連接數(shù)據(jù)庫(kù)時(shí),可以把數(shù)據(jù)庫(kù)的配置寫在配置文件 jdbc.properties:
driver=com.mysql.jdbc.Driver jdbcUrl=jdbc:mysql://localhost:3306/user user=root password=123456
這樣我們就可以通過(guò)加載properties配置文件來(lái)連接數(shù)據(jù)庫(kù),達(dá)到深層次的解耦目的,如果想要換成oracle或是DB2,我們只需要修改配置文件即可,不用修改任何代碼就可以更換數(shù)據(jù)庫(kù)。
二、Properties類
java中提供了配置文件的操作類Properties類(java.util.Properties):
讀取properties文件的通用方法:根據(jù)鍵得到value
/** * 讀取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中:
/** * 把.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文件來(lái)加載程序需要的配置信息,比如JDBC、MyBatis框架等。Properties類則是properties文件和程序的中間橋梁,不論是從properties文件讀取信息還是寫入信息到properties文件都要經(jīng)由Properties類。
常見方法
除了從Hashtable中所定義的方法,Properties定義了以下方法:
Properties類
下面我們從寫入、讀取、遍歷等角度來(lái)解析Properties類的常見用法:
寫入
Properties類調(diào)用setProperty方法將鍵值對(duì)保存到內(nèi)存中,此時(shí)可以通過(guò)getProperty方法讀取,propertyNames方法進(jìn)行遍歷,但是并沒有將鍵值對(duì)持久化到屬性文件中,故需要調(diào)用store方法持久化鍵值對(duì)到屬性文件中。
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文件的方式:
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()); } }
其中第一、四、五、六種方式都是先獲得文件的輸入流,然后通過(guò)Properties類的load(InputStream inStream)方法加載到Properties對(duì)象中,最后通過(guò)Properties對(duì)象來(lái)操作文件內(nèi)容。
第二、三中方式是通過(guò)ResourceBundle類來(lái)加載Properties文件,然后ResourceBundle對(duì)象來(lái)操做properties文件內(nèi)容。
其中最重要的就是每種方式加載文件時(shí),文件的路徑需要按照方法的定義的格式來(lái)加載,否則會(huì)拋出各種異常,比如空指針異常。
遍歷
下面給出四種遍歷Properties中的所有鍵值對(duì)的方法:
/** * 輸出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è)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java8新特性之stream的collect實(shí)戰(zhàn)教程
這篇文章主要介紹了java8新特性之stream的collect實(shí)戰(zhàn)教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08Java實(shí)戰(zhàn)之貪吃蛇小游戲(源碼+注釋)
這篇文章主要介紹了Java實(shí)戰(zhàn)之貪吃蛇小游戲(源碼+注釋),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04java后端把數(shù)據(jù)轉(zhuǎn)換為樹,map遞歸生成json樹,返回給前端(后臺(tái)轉(zhuǎn)換)
這篇文章主要介紹了java后端把數(shù)據(jù)轉(zhuǎn)換為樹,map遞歸生成json樹,返回給前端實(shí)例(后臺(tái)轉(zhuǎn)換),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-01-01SpringBoot配置shiro安全框架的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot配置shiro安全框架的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Java19新特性中結(jié)構(gòu)化并發(fā)的使用
Java19在并發(fā)編程領(lǐng)域引入了一個(gè)全新的概念:結(jié)構(gòu)化并發(fā),這一特性旨在簡(jiǎn)化并發(fā)任務(wù)的管理,提升多線程程序的可維護(hù)性和安全性,使其生命周期和控制流更加有序和明確,感興趣的可以了解一下2024-09-09linux系統(tǒng)下查看jdk版本、路徑及配置環(huán)境變量
在Linux系統(tǒng)中,配置JDK環(huán)境變量是非常重要的,它可以讓你在終端中直接使用Java命令,這篇文章主要給大家介紹了關(guān)于linux系統(tǒng)下查看jdk版本、路徑及配置環(huán)境變量的相關(guān)資料,需要的朋友可以參考下2024-01-01idea2020中復(fù)制一個(gè)微服務(wù)實(shí)例的方法
這篇文章主要介紹了idea2020中復(fù)制一個(gè)微服務(wù)實(shí)例的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09