1. 程式人生 > >載入properties檔案的6種方法

載入properties檔案的6種方法

總結

在普通的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();  
    }  
  
}