.properties (Java 配置文件)

此心光明,亦復何言

在我們平時寫程序的時候,有些參數是經常改變的,而這種改變不是我們預知的。比如說我們開發了一個操作數據庫的模塊,在開發的時候我們連接本地的數據庫那么IP ,數據庫名稱,表名稱,數據庫主機等信息是我們本地的,要使得這個操作數據的模塊具有通用性,那么以上信息就不能寫死在程序里。通常我們的做法是用配置文件來解決。

各種語言都有自己所支持的配置文件,配置文件中很多變量是經常改變的,這樣做也是為了方便用戶,讓用戶能夠脫離程序本身去修改相關的變量設置。像Python支持的配置文件是.ini文件,同樣,它也有自己讀取配置文件的類ConfigParse,方便程序員或用戶通過該類的方法來修改.ini配置文件。在Java中,其配置文件常為.properties文件,格式為文本文件,JDK 內置的java.util.Properties 類 支持.properties 文件的讀寫,為我們操作 .properties 文件提供了便利。

一 .properties 文件的形式

設數據如下:

#以下為服務器、數據庫信息
dbPort = localhost
databaseName = mydb
dbUserName = root
dbPassword = root
#以下為數據庫表信息
dbTable = mytable
#以下為服務器信息
ip = 192.168.0.9

上面的信息我們假設保存在 db.properties 文件中。其中# 開始的一行為注釋信息;在等號“= ”左邊的我們稱之為key ;等號“= ”右邊的我們稱之為value 。(其實就是我們常說的鍵- 值對)key 應該是我們程序中的變量。而value 是我們根據實際情況配置的。


db.properties

二 Java中Properties類的操作

1 Java Properties類

Java中有個比較重要的類Properties(Java.util.Properties),主要用于讀取Java的配置文件,文件的內容的格式是“鍵=值”的格式,文本注釋信息可以用"#"來注釋。

Properties類繼承自Hashtable,如下:


Properties

Properties類提供了幾個主要的方法:
1 load( InputStream inStream )
這個方法可以從 .properties屬性文件 對應的文件輸入流中,加載屬性列表到Properties類對象,即通過對上面的 properties 文件進行裝載來獲取該文件中的所有鍵 - 值對。以供 getProperty ( String key) 來搜索。

如下面的代碼:

Properties pro = new Properties();
FileInputStream in = new FileInputStream("a.properties");
pro.load(in);
in.close();

2 getProperty ( String key )
獲取屬性信息
即用指定的鍵在屬性列表中搜索屬性 也就是通過參數 key 得到 key 所對應的 value

3 setProperty ( String key, String value )
設置屬性信息
即通過調用基類的put方法來設置 鍵 - 值對。

4 store( OutputStream out, String comments )
這個方法將Properties類對象的屬性列表保存到輸出流中
即與 load 方法相反,該方法將鍵 - 值對寫入到指定的文件中去

如下面的代碼:

FileOutputStream oFile = new FileOutputStream(file, "a.properties");
pro.store(oFile, "Comment");
oFile.close();

如果comments不為空,保存后的屬性文件第一行會是#comments,表示注釋信息;如果為空則沒有注釋信息。

注釋信息后面是屬性文件的當前保存時間信息。

5 clear( )
清除所有裝載的 鍵 - 值對。該方法在基類中提供。

load 和 getProperty最常用
有了以上幾個方法我們就可以對.properties 文件進行操作了!

2 Java讀取Properties文件

Java讀取Properties文件的方法有很多,但是最常用的還是通過java.lang.Class類 getResourceAsStream(String name)方法來實現,如下可以這樣調用:

InputStream in = getClass().getResourceAsStream("資源Name");

或者下面這種也常用:

InputStream in = new BufferedInputStream(new FileInputStream(filepath));
3 一個比較綜合的實例

根據key讀取value
讀取properties的全部信息
寫入新的properties信息

//關于Properties類常用的操作
public class TestProperties {
    //根據Key讀取Value
    public static String GetValueByKey(String filePath, String key) {
        Properties pps = new Properties();
        try {
            InputStream in = new BufferedInputStream (new FileInputStream(filePath));  
            pps.load(in);
            String value = pps.getProperty(key);
            System.out.println(key + " = " + value);
            return value;
            
        }catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
    
    //讀取Properties的全部信息
    public static void GetAllProperties(String filePath) throws IOException {
        Properties pps = new Properties();
        InputStream in = new BufferedInputStream(new FileInputStream(filePath));
        pps.load(in);
        Enumeration en = pps.propertyNames(); //得到配置文件的名字
        
        while(en.hasMoreElements()) {
            String strKey = (String) en.nextElement();
            String strValue = pps.getProperty(strKey);
            System.out.println(strKey + "=" + strValue);
        }
        
    }
    
    //寫入Properties信息
    public static void WriteProperties (String filePath, String pKey, String pValue) throws IOException {
        Properties pps = new Properties();
        
        InputStream in = new FileInputStream(filePath);
        //從輸入流中讀取屬性列表(鍵和元素對) 
        pps.load(in);
        //調用 Hashtable 的方法 put。使用 getProperty 方法提供并行性。  
        //強制要求為屬性的鍵和值使用字符串。返回值是 Hashtable 調用 put 的結果。
        OutputStream out = new FileOutputStream(filePath);
        pps.setProperty(pKey, pValue);
        //以適合使用 load 方法加載到 Properties 表中的格式,  
        //將此 Properties 表中的屬性列表(鍵和元素對)寫入輸出流  
        pps.store(out, "Update " + pKey + " name");
    }
    
    public static void main(String [] args) throws IOException{
        //String value = GetValueByKey("db.properties", "name");
        //System.out.println(value);
        //GetAllProperties("db.properties");
        WriteProperties("db.properties","long", "212");
    }
}

結果:
db.properties中文件的數據為:

#Update long name
#Sun Feb 23 18:17:16 CST 2014
name=JJ
Weight=4444
long=212
Height=3333

三 小結

通過上面的例子不難看出,在Java中操作配置文件是非常簡單的。在一個需要用到大量配置信息的模塊或系統里,我們有必要封裝一個專門的類來共使用。通過最后的main函數調用。

世界上所有的追求都是因為熱愛
一枚愛編碼 愛生活 愛分享的IT信徒
— hongXkeX

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,555評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,516評論 2 379

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,826評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,922評論 6 342
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,733評論 18 399
  • 把風景穿在腳上 腳下走過美麗 鞋子走到哪 哪里更愜意 穿鞋也要美麗 舒適 大方 隨心隨性 用實惠的價格買到最好的鞋...
    機靈小不懂君閱讀 215評論 0 2
  • 起個大早,去圖書館上自習,學的正high的時候,對面坐了一個男生,向來討厭對面坐男生,因為總感覺各種不自在,我默默...
    海爾兄弟姐妹1026閱讀 932評論 0 0