java讀取.properties配置文件

如下都以date.properties文件爲例,該文件放在src目錄下,文件內容爲java

startdate=2011-02-07
totalweek=25緩存

方法一:函數

public class Stweek {
 static private String startdate = null;
 static private String totalweek = null;
 synchronized static public void loads(){
  if(startdate == null || totalweek == null)
  {
   FileInputStream is = null;
   Properties dbProps = new Properties();
     try {
        is = new FileInputStream(filepath);  
        dbProps.load(is);
        startdate = dbProps.getProperty("startdate");
        totalweek = dbProps.getProperty("totalweek");
      }
      catch (Exception e) {
        System.err.println("不能讀取屬性文件. " +
       "請確保db.properties在CLASSPATH指定的路徑中");
      }
  }
 }

 public static String getStartdate() {
  if(tartdate==null)
   loads();
  return startdate;
 }

 
 public static String getTotalweek() {
  if(startdate==null)
   loads();
  return totalweek;
 } 測試

}內存

以上方法雖然也能得到配置文件內容,但是其最大的問題就是文件路徑的定位(就是代碼中的filepath取值問題),當採用絕對定位的時候,若是將工程移到另一個盤符下運行,就須要修改源代碼,不然就會報錯,但是若是使用相對路徑,當Stweek 類移到另一個包中時,仍是要修改源代碼,不然會報錯,因此說這個方法侷限太大,很差 ,如下方法二能解決這個問題,但是其仍是有些問題get

方法二:io

public class Stweek {
 InputStream is = null;
 Properties dbProps = null;
 public Stweek() {
  // TODO Auto-generated constructor stub
  is = getClass().getResourceAsStream("/date.properties");
  dbProps = new Properties();
    try {
      dbProps.load(is);
    }
    catch (Exception e) {
      System.err.println("不能讀取屬性文件. " +
     "請確保db.properties在CLASSPATH指定的路徑中");
    }
 }
 public String getStartdate()
 {
  String sd = null;
  sd = dbProps.getProperty("startdate");
  return sd;
 }
 
 public String getTotalweek()
 {
  String totalweek=null;
     totalweek = dbProps.getProperty("totalweek");
  return totalweek;
 }class

}import

這個方法的好處就是不用指出配置文件的絕對路徑,並且無論是將Stweek 類放到另外的包中,仍是將整個工程移到到另外的盤符下,代碼依然能夠正常運行,不會有找不到文件的問題,但是這個方法仍然有一個重大的缺陷,由於咱們每每但願配置文件可以緩存在內存中,這樣不用每次讀取時都要訪問硬盤(訪問外存太浪費時間),爲此咱們但願使用靜態變量、靜態方法來緩存和得到變量,同時可以實現這些值的動態加載(load),那麼問題來了,由於getClass().getResourceAsStream("/date.properties"); 這一句只能出如今構造函數中(同鞋能夠本身測試一下),動態load中並不能使用這個方法,怎麼辦呢,且看第三個方法變量

 

方法三:

import java.io.InputStream;
import java.util.Properties;

public class Stweek {
 static private String startdate = null;
 static private String totalweek = null;
 static{
  loads();
 }
 synchronized static public void loads(){
  if(startdate == null || totalweek == null)
  {
   InputStream is = Stweek.class.getResourceAsStream("/date.properties");
   Properties dbProps = new Properties();
     try {
        dbProps.load(is);
        startdate = dbProps.getProperty("startdate");
        totalweek = dbProps.getProperty("totalweek");
      }
      catch (Exception e) {
        System.err.println("不能讀取屬性文件. " +
       "請確保db.properties在CLASSPATH指定的路徑中");
      }
  }
 }
 public static String getStartdate() {
  if(startdate==null)
   loads();
  return startdate;
 }
 public static String getTotalweek() {
  if(startdate==null)
   loads();
  return totalweek;
 } 

}這個方法不只可以緩存配置文件內容,還可以作到自動加載配置文件的內容到內存,使用者徹底不用考慮手動加載的過程,只須要在須要用到的地方直接調用Stweek.getStartdate()便可(由於是靜態方法,事先連對像也不用建立的),這樣若是內存中有緩存,函數就會直接讀取內存中的數據,節省時間,若是沒有緩存也不用擔憂,系統會自動爲你加載,使用者徹底不用知道其是如何實現的,只須要知道我能直接調用函數得到想要的值就好了,呵呵,簡單吧

相關文章
相關標籤/搜索