1. 程式人生 > 程式設計 >Java載入property檔案配置過程解析

Java載入property檔案配置過程解析

這篇文章主要介紹了java載入property檔案配置過程解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

1 properties簡介:

properties是一種文字檔案,內容格式為:

key = value #單行註釋

適合作為簡單配置檔案使用,通常作為引數配置、國際化資原始檔使用。

對於複雜的配置,就需要使用XML、YML、JSON等了

2 java載入Properties:

java載入properties主要通過2個util包下的工具類: Properties類、 ResourceBundle類

2.1 通過Properties類載入:

Properties類通過load()方法載入配置資訊,這個方法接收一個輸入流引數:InputStream、Reader。

Properties提供get(String key) 方法讀取指定的配置項。

2.1.1 通過ClassLoader獲取InputStream載入:

該方式只能讀取類路徑下的配置檔案

(1)先建立Properties物件

(2)獲取property檔案對應的輸入流in

(3)使用Properties載入輸入流in

(4)通過Properties.get(key)方法獲取配置,如果配置資訊不存在,則返回null

/**
 * 基於ClassLoader讀取properties;
 * 該方式只能讀取類路徑下的配置檔案,有侷限但是如果配置檔案在類路徑下比較方便。
 */
public static void method1() {
   System.out.println("使用ClassLoader方式載入properties");
   Properties properties = new Properties();
   /*
   * 使用ClassLoader載入properties配置檔案生成對應的輸入流。
   * 使用此種方式,要求property檔案必須要放在src目錄下,編譯之後會被放到class檔案相同目錄下。
   * 因為ClassLoad的基礎路徑是相對於編譯後class檔案所在目錄(可能是bin,classes),如果將properties放在專案根目錄下,使用此種方式可能會找不到 properties檔案
   */
   //必須要以 /開始  , 是在classes檔案根目錄下尋找
   InputStream in = PropertiesDemo.class.getResourceAsStream("/properties/a.properties");
   System.out.println(PropertiesDemo.class.getClassLoader().getResource(".").getPath());
   try {
    properties.load(in);
   } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
   }finally {
     closeResource(in);
   }
   
   System.out.println(properties.get("name"));
   System.out.println(properties.get("age"));
}

2.1.2 通過構建Reader載入:

該方式的優點在於可以讀取任意路徑下的配置檔案

(1)建立Properties物件

(2)建立一個Reader,可以指定路徑,不侷限於類路徑

(3)使用Properties載入Reader

(4)Properties.get(key)方法讀取配置

/**
 * 使用inputStream讀取配置檔案
 * 該方式的優點在於可以讀取任意路徑下的配置檔案
 */
public static void method2() {
   System.out.println("使用InputStream方式載入properties");
   Properties properties = new Properties();
   BufferedReader reader = null;
   try {
     /*
      * System.getProperty("user.dir"): 獲取專案根路徑, 而後附加配置檔案的路徑
     */
     reader = new BufferedReader(new FileReader(System.getProperty("user.dir") + "/properties/a.properties"));
     properties.load(reader);
     System.out.println(properties.get("name"));
     System.out.println(properties.get("age"));
   } catch (FileNotFoundException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
   } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
   }finally {
     closeResource(reader);
   }
 }

2.2 通過ResourceBundle類載入:

ResourceBundle讀取配置有2種方式:

(1)指定檔案路徑 :相對於src、classes的相對路徑

(2)提供InputStream

ResourceBundle提供方法getString(key) 和 getObject(key)讀取配置項
使用路徑載入,不需要指定檔案字尾名,且不需要手動關閉相關資源,比Properties類操作要簡單。

/**
 * 通過ResourceBundle 讀取配置,此種方式專案Properties要簡單
 * ResourceBundle讀取配置有2種方式: (1)指定檔案路徑 (2)提供InputStream
 */
public static void method3() {
  System.out.println("使用ResourceBundle方式載入properties");
  /*
  * (1)直接指定檔案路徑:

  * 可以使用相對路徑,從類路徑開始,且不需要指定properties檔案的字尾
  */
  ResourceBundle resource = ResourceBundle.getBundle("properties/b");
  System.out.println(resource.getString("name"));
  System.out.println(resource.getString("age"));

 


  try {
   /*
   * (2)通過InputStream載入配置:

   * 通過當前類的class例項,獲取資源輸入流
   */
   resource = new PropertyResourceBundle(PropertiesDemo.class.getResourceAsStream("/properties/a.properties"));
   System.out.println(resource.getString("name"));
   System.out.println(resource.getString("age"));
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。