載入properties檔案的6種方法
阿新 • • 發佈:2019-02-05
總結
在普通的Java專案中,所有的方法都能成功
在開發專案中,能成功的方法只有第一種,第三種和第六種
其中第一種和第六種方法需要的入參是properties檔案的全類名
第三種方法在開發專案中區別於普通的Java專案,需要的入參只能為properties檔名,不含包路徑
package util; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import java.util.PropertyResourceBundle; import java.util.ResourceBundle; import org.junit.Test; /**方法 載入properties檔案的6種基本方式 * * java載入properties檔案的方式主要分為兩大類: * 第一類,首先獲得檔案的輸入流,再通過import java.util.Properties類中的load(InputStream in)方法載入properties物件, 通過Properties物件來操作檔案內容 * 第二類,首先通過import java.util.ResourceBundle類的getBundle(String baseName)方法載入properties檔案, 然後ResourceBundle物件來操做properties檔案內容 * * 其中最重要的就是每種方式載入檔案時,檔案的路徑需要按照方法的定義的格式來載入,否則會丟擲各種異常,比如空指標異常 * * @author 方軒靈動 * @version 2017-10-24 */ public class TestProperties { private static String Path_properties = "src/util/db.properties";//全類名 private static String Url = null; private static String DriverClassName = null; private static String User = null; private static String Password = null; //---類別1 首先獲得檔案輸入流 通過Properties物件來操作檔案內容 ---開始 /**方法 第1種方法 重要,全類名 在專案中成功 * FileInputStream讀取全類名 */ @Test public void loadProperties1(){ //獲得properties Properties property = new Properties();//流檔案 InputStream ins = null; try { ins = new FileInputStream(Path_properties); } catch (FileNotFoundException e) { e.printStackTrace(); } //InputStream in2 = TestProperties.class.getClassLoader().getResourceAsStream("db.properties"); try { property.load(ins); // property2.load(in2);//in2載入錯誤,獲得的是null } catch (IOException e1) { System.out.println("Properties載入失敗"); e1.printStackTrace(); } printProperties(property); } /**方法 第2種方法 重要,載入properties檔案的類 在專案中失敗 * * 使用class變數的getResourceAsStream()方法 * 注意,getResourceAsStream()方法的引數按格式寫到 包路徑+properties檔名+.字尾, 根目錄 有字首 / 符號 */ @Test public void loadProperties2(){ InputStream ins = TestProperties.class.getResourceAsStream("/util/db.properties"); Properties property = new Properties(); try { property.load(ins); } catch (IOException e) { e.printStackTrace(); } printProperties(property); } /**方法 第3種方法 重要,載入properties檔案的類 在專案中成功,但不能新增包路徑,直接傳參properties檔名才能成功載入,例如src/main/resources/db.properties,傳參db.properties * * 對比方法2,TestProperties.class.後面還多了.getClassLoader()方法,根目錄 沒有字首 / 符號 * * 使用class.getClassLoader()所得到的java.lang.ClassLoader的getResourceAsStream()方法 * getResourceAsStream(name)方法的引數必須是 包路徑+properties檔名+.字尾,包路徑沒有字首 / 符號 * 否則會報空指標異常 */ @Test public void loadProperties3(){ InputStream ins = TestProperties.class.getClassLoader().getResourceAsStream("util/db.properties"); Properties property = new Properties(); try { property.load(ins); } catch (IOException e) { e.printStackTrace(); } printProperties(property); } /**方法 第4種方法 使用類載入器ClassLoader 在專案中失敗 * * 使用java.lang.ClassLoader類的getSystemResourceAsStream()靜態方法 * getSystemResourceAsStream()方法的引數格式也是有固定要求的, 包路徑+properties檔名+.字尾,根目錄 沒有字首 / 符號 */ @Test public void loadProperties4(){ InputStream ins = ClassLoader.getSystemResourceAsStream("util/db.properties"); Properties property = new Properties(); try { property.load(ins); } catch (IOException e) { e.printStackTrace(); } printProperties(property); } //---類別1 首先獲得檔案輸入流 通過Properties物件來操作檔案內容 ---結束 //---類別2 首先獲得properties檔案 通過ResourceBundle物件來操做properties檔案內容---開始 /**方法 第5種方法 例如檔案db.properties,只需要檔名db,不需要拓展名.properties 在專案中失敗 * * 使用java.util.ResourceBundle類的getBundle()方法 * 注意:這個getBundle()方法的引數只能寫成 包路徑+properties檔名,根目錄 沒有字首 / 符號 * 否則將拋異常 */ @Test public void loadProperties5(){ ResourceBundle rb = ResourceBundle.getBundle("util/db"); //rb.getString()方法,引數是properties檔案的各屬性名 System.out.println(rb.getString("jdbc.driverClassName")); System.out.println(rb.getString("jdbc.url")); System.out.println(rb.getString("jdbc.username")); System.out.println(rb.getString("jdbc.password")); } /**方法 第6種方法 重要,properties的全類名 在專案中成功 * * 使用java.util.PropertyResourceBundle類的建構函式 */ @Test public void loadProperties6(){ InputStream ins = null; ResourceBundle rb = null; try { ins = new BufferedInputStream(new FileInputStream(Path_properties)); rb = new PropertyResourceBundle(ins); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //rb.getString()方法,引數是properties檔案的各屬性名 System.out.println(rb.getString("jdbc.driverClassName")); System.out.println(rb.getString("jdbc.url")); System.out.println(rb.getString("jdbc.username")); System.out.println(rb.getString("jdbc.password")); } //---類別2 首先獲得properties檔案 通過ResourceBundle物件來操做properties檔案內容---結束 /**方法 輸出 Properties 的屬性 * @param property */ public void printProperties(Properties property){ //連線屬性 DriverClassName = property.getProperty("jdbc.driverClassName"); Url = property.getProperty("jdbc.url"); User = property.getProperty("jdbc.username"); Password = property.getProperty("jdbc.password"); System.out.println(DriverClassName+"\n"+Url+"\n"+User+"\n"+Password); System.out.println(); } }