亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

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

2024-07-14 08:44:04
字體:
來源:轉載
供稿:網友

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

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

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

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

  現在的問題是,我們如何讀取位于程序安裝文件中的配置文件的信息?比如,在上面的圖中, ConnectionPool是一個數據庫連接池類,它需要在系統啟動時自動讀取存儲在database.properties中的數據庫連接和配置信息,以便設置相關的數據庫連接。這樣,我們 就需要在程序中測定目前程序安裝或部署的位置,以便讀取對應的屬性文件。

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

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

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

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

//如果沒有找到,再從當前系統的用戶目錄中進行查找
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);

//如果還是沒有找到,則從系統所有的類路徑中查找
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{
//靜態初始化器,將在ConnectionPools加載時自動執行
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,為相應的數據源對象設置相關的屬性,比如C3P0........
}
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品黄色影片导航在线观看| 成人亚洲欧美一区二区三区| 久热精品在线视频| 草民午夜欧美限制a级福利片| 日韩免费在线电影| 日韩在线一区二区三区免费视频| 国产在线视频2019最新视频| 亚洲欧美日韩另类| 最好看的2019年中文视频| 日韩成人在线免费观看| 丰满岳妇乱一区二区三区| 亚洲黄页视频免费观看| 欧美激情精品久久久久久大尺度| 午夜精品久久17c| 成人在线中文字幕| 日韩日本欧美亚洲| 亚洲裸体xxxx| 啪一啪鲁一鲁2019在线视频| 亚洲欧美日韩综合| 成人亚洲综合色就1024| 狠狠躁夜夜躁久久躁别揉| 欧美极品欧美精品欧美视频| 91精品视频网站| 久久久久女教师免费一区| 亚洲男子天堂网| 黑人精品xxx一区一二区| 欧美精品国产精品日韩精品| 亚洲色图第一页| 欧美另类极品videosbest最新版本| 九九久久久久久久久激情| 欧美日韩国产色| xvideos亚洲人网站| 国产精品久久久久久中文字| 成人信息集中地欧美| 欧美黑人国产人伦爽爽爽| 色无极亚洲影院| 国产精品高清在线观看| 亚洲欧美国产精品va在线观看| 国产精品久久久久久久久男| 久久99久久99精品免观看粉嫩| 欧美午夜性色大片在线观看| 精品久久久久久国产91| 国产亚洲精品久久久久久777| 国产精品精品视频| 国产精品欧美激情| 91福利视频在线观看| 日韩一二三在线视频播| 亚洲性生活视频在线观看| 国产亚洲精品美女| 日本精品免费观看| 欧洲成人午夜免费大片| 日韩中文字幕不卡视频| 国产亚洲欧美另类中文| 国产精品欧美日韩一区二区| 国产精品va在线播放我和闺蜜| 日韩精品视频三区| 一本大道亚洲视频| 国内精品400部情侣激情| 4388成人网| 久久久精品欧美| 国产欧美在线视频| 日韩在线中文视频| 国产精品综合久久久| 欧美国产精品人人做人人爱| 亚洲人精选亚洲人成在线| 黄色成人在线播放| 亚洲女人天堂av| 欧美精品videos| 欧美在线视频一区| www.亚洲一二| 色综合久综合久久综合久鬼88| 国产91精品不卡视频| 欧美大胆a视频| 亚洲经典中文字幕| www日韩欧美| 欧美黑人性视频| zzjj国产精品一区二区| 欧美又大又粗又长| 日韩成人av在线| 国产综合在线观看视频| 色悠久久久久综合先锋影音下载| 久久久久久久久久久av| 疯狂做受xxxx高潮欧美日本| 欧美日韩视频在线| 26uuu日韩精品一区二区| 欧美精品日韩www.p站| 欧美极品少妇与黑人| 亚洲国产日韩欧美在线动漫| 性日韩欧美在线视频| 国产视频久久久| 成人观看高清在线观看免费| 久久免费视频在线观看| 久久精品国产精品| 在线一区二区日韩| 欧美激情一级精品国产| 亚洲午夜久久久久久久| 欧美特级www| 91综合免费在线| 精品亚洲一区二区三区四区五区| 欧洲美女7788成人免费视频| 成人a级免费视频| 国产丝袜精品第一页| 亚洲国产欧美一区二区三区久久| 91av在线不卡| 久久影院中文字幕| 国产91精品最新在线播放| 国产一区二区三区在线观看网站| 国产精品美女主播在线观看纯欲| 国产精品稀缺呦系列在线| 亚洲美女性生活视频| 日本电影亚洲天堂| yw.139尤物在线精品视频| 亚洲欧美日韩中文在线| 亚洲午夜性刺激影院| 高清欧美一区二区三区| 亚洲成人av片在线观看| 欧美日韩在线免费观看| 国产亚洲欧美日韩美女| 8050国产精品久久久久久| 亚洲成人激情视频| 国产色综合天天综合网| 日本高清久久天堂| 成人中文字幕+乱码+中文字幕| 精品国偷自产在线视频| 亚洲精品福利在线| 在线电影欧美日韩一区二区私密| 亚洲曰本av电影| 日韩欧美中文第一页| 欧美一区二区大胆人体摄影专业网站| 精品久久久久久久久中文字幕| 欧美日韩国产一区二区| 日韩毛片在线观看| 8090成年在线看片午夜| 法国裸体一区二区| 亚洲综合中文字幕68页| 久久成人精品电影| 国产精品成人av性教育| 日本免费一区二区三区视频观看| 91久久久亚洲精品| 久久精品久久久久久国产 免费| 精品国产乱码久久久久久虫虫漫画| 国产欧美一区二区三区久久人妖| 欧美一区二区三区四区在线| 欧美大片免费观看在线观看网站推荐| 日韩av第一页| 日本中文字幕久久看| 欧美多人爱爱视频网站| 欧美一区二区三区免费观看| 91免费综合在线| 久久精品成人欧美大片| 欧美性xxxxx| 国产91免费看片| 国产欧美日韩免费看aⅴ视频| 中文字幕在线观看亚洲| 中国人与牲禽动交精品| 91高清在线免费观看| 日韩专区在线播放| 茄子视频成人在线| 久久精品成人一区二区三区| 欧美高清videos高潮hd| 久久久电影免费观看完整版| 精品中文字幕在线| 91免费看国产| 国产精品99久久久久久www|