麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

Java程序中的配置文件的存放和讀取

2019-11-17 04:17:34
字體:
供稿:網(wǎng)友

 大家可能經(jīng)常會遇到在java程序中存取程序配置文件的需求,比如,為了能夠和不同的數(shù)據(jù)庫連接,我們經(jīng)常把數(shù)據(jù)庫連接的信息存放到屬性文件中,這些信息一般包括數(shù)據(jù)庫驅(qū)動程序類名、數(shù)據(jù)庫連接的URL,數(shù)據(jù)庫的用戶名和口令等等。為了便于程序的安裝或部署,我們經(jīng)常會把這些的配置文件存放到程序安裝的根目錄中。由于Java程序用包來分組類,有時候?qū)⑦@些配置文件放入到讀取它們的類所在的包目錄中會更好一些。比如,在下面的圖示中,將數(shù)據(jù)庫配置文件 database.PRoperties放到數(shù)據(jù)庫讀取類所在的包目錄就是一種比較清晰的存儲方案:

|-----------其它包目錄
|
|
-------edu.ec.database
|
|---------------ConnectionPool(數(shù)據(jù)庫連接池類)
|
|---------------Dao(數(shù)據(jù)庫訪問對象類)
|
|---------------DaoFactory(Dao的工廠類)
|
|---------------database.properties(數(shù)據(jù)庫配置屬性文件)
|
|---------------RecordSet(記錄集類)

  在這種存儲方案中,所有的與數(shù)據(jù)庫相關(guān)的類和配置文件都在同一個包目錄中;在開發(fā)過程中,配置文件和源文件也按采用這種方式進行組織,這樣會使得程序的數(shù)據(jù)庫訪問維護變得相當清晰明了。

  大部分開發(fā)工具在編譯打包這樣的源文件組織時,會自動將相關(guān)配置文件和類文件放到生成的目標文件夾中或JAR文件中。一般情況下,我們在發(fā)布自己的 Java程序時,都是以JAR或WAR形式將程序打包發(fā)布,而對應的配置文件也會按照上述的目錄格式被放到了JAR或WAR文件中,這樣,就實現(xiàn)了配置文件和程序文件打包在一起發(fā)布的目的。

  現(xiàn)在的問題是,我們?nèi)绾巫x取位于程序安裝文件中的配置文件的信息?比如,在上面的圖中, ConnectionPool是一個數(shù)據(jù)庫連接池類,它需要在系統(tǒng)啟動時自動讀取存儲在database.properties中的數(shù)據(jù)庫連接和配置信息,以便設(shè)置相關(guān)的數(shù)據(jù)庫連接。這樣,我們 就需要在程序中測定目前程序安裝或部署的位置,以便讀取對應的屬性文件。

  在很多其他語言編寫的程序中,我們可以利用一些系統(tǒng)提供的API或一些全局對象獲取目前應用程序運行所在的目錄。比如VB,我們可以使用application對象測定當前程序的安裝位置,在Java程序中如何完成類似的任務呢?

  Java程序并沒有類似于VB那種全局對象,但如果我們觀察位于上述目錄結(jié)構(gòu)中的database.properties文件,應該發(fā)現(xiàn)其處于應用程序的 CLASSPATH中,這樣,我們就可以使用Java中的類裝載器中的相關(guān)的方法,讀出這些配置文件的信息,該類名為ClassLoader.比如,在上例中,我們可以先得到ConnectinPool的類裝載器,然后測定ConnectionPool類所在的包路徑,然后利用 ConnectionPool所在的包目錄讀出database.properties文件的信息,對應的偽代碼如下:

ClassLoader loader=ConnectionPool.class.getClassLoader();
得到ConnectionPool所在的包名;
將包名轉(zhuǎn)換為對應的目錄名,存入一個名為path的字符串變量中;
調(diào)用loader的getResourceAsStream(path+"database.properties"),得到輸入流

  下面是一個可實際運行的樣例代碼片段,它可自動測定傳入的類所在的包目錄,返回傳入的屬性文件所代表的輸入流。它還有一個附加的功能:如果屬性文件直接放到了當前類所在的根目錄(比如位于JAR文件的根目錄或WAR文件的WEB-INF/classes目錄中)、系統(tǒng)的用戶目錄系統(tǒng)、系統(tǒng)其他的類路徑中時,它也可以找到;當然,如果還是找不到,它將返回null.具體的代碼如下:

public class PropHelper{
/**
*guessPropFile:
*@param cls:和要尋找的屬性文件處于相同的包中的任意的類
*@param propFile:要尋找的屬性文件名
*/
public static java.io.InputStream guessPropFile(Class cls,String propFile){
try{
//得到類的類裝載器
ClassLoader loader=cls.getClassLoader();

//先從當前類所處路徑的根目錄中尋找屬性文件
java.io.InputStream in=loader.getResourceAsStream(propFile);
if(in!=null) return in;

//沒有找到,就從該類所處的包目錄中查找屬性文件
Package pack=cls.getPackage();
if(pack!=null){
String packName=pack.getName();
String path="";
if(packName.indexOf(".") < 0 )
path=packName+"/";
else{
int start=0,end=0;
end=packName.indexOf(".");
while(end!=-1){
path=path+packName.substring(start,end)+"/";
start=end+1;
end=packName.indexOf(".",start);
}
path=path+packName.substring(start)+"/";
}
in=loader.getResourceAsStream(path+propFile);
if(in!=null) return in;
}

//如果沒有找到,再從當前系統(tǒng)的用戶目錄中進行查找
java.io.File f=null;
String curDir=System.getProperty("user.dir");
f=new java.io.File(curDir,propFile);
if(f.exists()) return new java.io.FileInputStream(f);

//如果還是沒有找到,則從系統(tǒng)所有的類路徑中查找
String classpath=System.getProperty("java.class.path");
String[] cps=classpath.split(System.getProperty("path.separator"));

for(int i=0;i < cps.length; i++){
f=new java.io.File(cps[i],propFile);
if(f.exists()) break;
f=null;
}
if(f!=null) return new java.io.FileInputStream(f);
return null;
}catch(Exception e){throw new RuntimeException(e);}

}
}

  使用舉例:利用上述的方法,可在ConnectionPool中自動查找和ConnectionPool處于同一個包目錄中的database.properties的輸入流,并利用該輸入流讀入對應的屬性值的代碼如下:

public class ConnectionPool{
//靜態(tài)初始化器,將在ConnectionPools加載時自動執(zhí)行
static{
java.util.Properties dbProp=new java.util.Properties();
java.io.InputStream in=PropHelper.guessPropFile(edu.ec.database.ConnectionPool.class,"database.properties");
if(in!=null) dbProp.load(in);
//利用dbProp,為相應的數(shù)據(jù)源對象設(shè)置相關(guān)的屬性,比如C3P0........
}
}


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 日韩中文字幕三区 | 九九热九九| 调教小男生抽打尿孔嗯啊视频 | 一级做a爱片性色毛片高清 国产精品色在线网站 | 国产噜噜噜噜噜久久久久久久久 | 91在线色视频 | 久久精品视频2 | 手机在线看片国产 | 午夜生活理论片 | 婷婷中文字幕一区二区三区 | 国产手机av在线 | 欧美精品成人一区二区三区四区 | 国产xxxx岁13xxxxhd| 精品一区二区三区中文字幕老牛 | 天天草夜夜| 日韩精品中文字幕在线观看 | 欧美一级久久 | 欧美精品网址 | 亚洲自拍第一 | 九九久久视频 | 国产一区二区免费在线观看视频 | 九九热精| 在线天堂中文在线资源网 | 斗破苍穹在线观看免费完整观看 | 中文日韩在线视频 | 精品国产一区二区三区天美传媒 | 艹男人的日日夜夜 | 在线a毛片免费视频观看 | 久久精品免费国产 | 一级在线观看视频 | 大学生一级毛片在线视频 | av免费入口 | 在线观看免费毛片视频 | 国产流白浆高潮在线观看 | 桥本有菜免费av一区二区三区 | 色综合久久久久综合99 | 日韩伦理电影免费观看 | 午夜视频在线免费观看 | 久久亚洲精品11p | 一级在线观看 | 色播视频网站 |