java讀取properties設置裝備擺設文件的辦法。本站提示廣大學習愛好者:(java讀取properties設置裝備擺設文件的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是java讀取properties設置裝備擺設文件的辦法正文
本文實例講述了java讀取properties設置裝備擺設文件的辦法。分享給年夜家供年夜家參考。詳細剖析以下:
這兩天做java項目,用到屬性文件,到網上查材料,好半天也沒有找到一個滿足的辦法能讓我讀取到.properties文件中屬性值,很是愁悶,網上講的獲得屬性值年夜概有以下辦法,以下三種辦法逐步優化,以到達最好的後果以下都以date.properties文件為例,該文件放在src目次下,文件內容為:
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 類移到別的一個包中時,照樣要修正源代碼,不然會報錯,所以說這個辦法局限太年夜,欠好,以下辦法二能處理這個成績,可是其照樣有些成績
辦法二:
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;
}
}
這個辦法的利益就是不消指出設置裝備擺設文件的相對途徑,並且不論是將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()便可(由於是靜態辦法,事前連對像也不消創立的),如許假如內存中有緩存,函數就會直接讀取內存中的數據,節儉時光,假如沒有緩存也不消擔憂,體系會主動為你加載,應用者完整不消曉得其是若何完成的,只須要曉得我能直接挪用函數取得想要的值就好了,呵呵,簡略吧
備注:(與上文有關,本身的測試)
願望本文所述對年夜家的java法式設計有所贊助。