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法式設計有所贊助。