1. 程式人生 > >Properties讀取properties檔案

Properties讀取properties檔案

在編寫一個專案時,我們會時常修改一些配置變數來適應不同的執行環境,同時也讓使用者能夠脫離程式去修改相關的變數設定。通常我們將這些變數定義在後綴名為properties的檔案中,檔案內容的格式為“鍵=值”,文字用“#”註釋。  而java提供了java.util.Properties來讀取這些檔案,具體Properties參見憑海臨風的部落格:http://www.cnblogs.com/bakari/p/3562244.html  它提供了幾個主要的方法:
  1. getProperty ( String key),用指定的鍵在此屬性列表中搜索屬性。也就是通過引數 key ,得到 key 所對應的 value。
  2. load ( InputStream inStream),從輸入流中讀取屬性列表(鍵和元素對)。通過對指定的檔案(比如說上面的 test.properties 檔案)進行裝載來獲取該檔案中的所有鍵 - 值對。以供 getProperty ( String key) 來搜尋。
  3. setProperty ( String key, String value) ,呼叫 Hashtable 的方法 put 。他通過呼叫基類的put方法來設定 鍵 - 值對。
  4. store ( OutputStream out, String comments),以適合使用 load 方法載入到 Properties 表中的格式,將此 Properties 表中的屬性列表(鍵和元素對)寫入輸出流。與 load 方法相反,該方法將鍵 - 值對寫入到指定的檔案中去。
  5. clear (),清除所有裝載的 鍵 - 值對。該方法在基類中提供。
  要獲取定義在.properties中的值,首先要用Properties的方法load(InputStream inStream)來裝載配置檔案從而獲取配置檔案中的鍵值對,形成屬性列表,其次用getProperty(String key)來獲取屬性列表中對應的值。  此次主要有兩種讀取.properties檔案的方法(在Java Project中):  jdbc.properties:
  1. driverClass = com.mysql.jdbc.Driver  
  2. jdbcURL=jdbc:mysql://127.0.0.1:3306/protest?useUnicode=true&characterEncoding=utf-8 
  3. user = root  
  4. password = root  

  1.使用FileInputStream("資源名稱絕對路徑")    
  1. public Properties propertiesFromFile() throws FileNotFoundException{  
  2.         properties = new Properties();  
  3.         InputStream in = null;  
  4.         try
    {  
  5.             in = new BufferedInputStream(new FileInputStream(propertiesPath));  
  6.             properties.load(in);  
  7.         }catch (FileNotFoundException e){  
  8.             e.printStackTrace();  
  9.         } catch (IOException e) {  
  10.             e.printStackTrace();  
  11.         }finally{  
  12.             try {  
  13.                 in.close();  
  14.             } catch (IOException e) {  
  15.                 e.printStackTrace();  
  16.             }  
  17.         }  
  18.         return properties;  
  19.     }  

  2.使用getClass.getResourceAsStream("資源名稱") -推薦
  1. public Properties propertiesFromClass(){  
  2.     properties = new Properties();  
  3.     InputStream in1 = this.getClass().getResourceAsStream(propertiesPath);  
  4.     InputStream is=PropertiesLoad.class.getResourceAsStream("/jdbc.properties");  
  5.     try {  
  6.         properties.load(in1);  
  7.     } catch (IOException e) {  
  8.         e.printStackTrace();  
  9.     }finally{  
  10.         try {  
  11.             in1.close();  
  12.         } catch (IOException e) {  
  13.             e.printStackTrace();  
  14.         }  
  15.     }  
  16.     return properties;  
  17. }  
     最後使用getProperty(key)獲取properties中的值:
  1. PropertiesLoad proLoad = new PropertiesLoad(propertiesPath);  
  2. String DriverClass = proLoad.propertiesFromClass().getProperty("driverClass");  
對於在程式中對properties檔案的修改
  1. PropertiesLoad proLoad = new PropertiesLoad(propertiesPath);  
  2. Properties pro = proLoad.propertiesFromClass();  
  3. OutputStream out = new FileOutputStream(DBconnect.class.getResource("/jdbc1.properties").toString().substring(6));  
  4. pro.setProperty("password", password+"1");  
  5. try {  
  6.      pro.store(out, "ceshiwenjian01");  
  7.      } catch (IOException e) {  
  8.     e.printStackTrace();  
  9.      }  
結果

jdbc1.properties:

  1. #ceshiwenjian01  
  2. #Tue Aug 3016:06:07 GMT+08:002016
  3. driverClass=com.mysql.jdbc.Driver  
  4. user=root  
  5. password=root1  
  6. jdbcURL=jdbc\:mysql\://127.0.0.1\:3306/protest?useUnicode\=true&characterEncoding\=utf-8 
在上述的例子中,如果將Properties pro = proLoad.propertiesFromClass();換成Properties pro = new Properties();那麼最後jdbc1.properties中的鍵值對只剩下password。所以所謂的setProperties(key,value)是將鍵值對寫放入pro中,然後pro通過store將所有的pro裡的鍵值對寫入到檔案中。上例中最後呈現的結果類似於改變鍵值對的值是因為pro裝載了原來的鍵值對。注:在我們知道如何讀寫一個屬性檔案之後,我們仍然還有很多需要注意的問題,因為load和store方法都是按照ISO-8859-1的編碼方式讀寫屬性流檔案的,而ILatin1 的字元和某些特殊字元,而對於非Latin1 的字元和某些特殊字元,則要使用與字元和字串字面值所用的類似轉義序列,以值和元素的形式來表示它們。所以當我們在處理中文時,不可以在直接修改屬性檔案時,將中文的值賦予給屬性,而是要在JAVA程式中通過setProperty方法給屬性賦予中文的值,因為這樣store會將中文轉換成 unicode碼,在讀取時系統會將讀取到的unicode碼按系統的編碼打印出來,對於中文系統,通常是GBK碼,這樣中文才能夠正常顯示。