轉載自http://blog.163.com/wb_zhaoyuwei/blog/static/183075439201261764454791/當我們自己的程式需要處理配置文件時(比如xml文件或properties文件),通常會遇到兩個問題: (1)我的配置文件應該放在哪裡? (2)怎麼我的.....
轉載自http://blog.163.com/wb_zhaoyuwei/blog/static/183075439201261764454791/
當我們自己的程式需要處理配置文件時(比如xml文件或properties文件),通常會遇到兩個問題:
(1)我的配置文件應該放在哪裡?
(2)怎麼我的配置文件找不到了?
對於第一個問題,答案是:請將你的資源文件放在classpath里,如果資源文件在jar中,請將該jar文件也加到classpath裡面。
對於第二個問題,就得看你是使用的是哪個類(Class還是ClassLoader)來載入資源文件了,所以接下來分別討論一下Class類和ClassLoader類對於資源文件的載入機制。
(一)用Class類載入資源文件
通過調用Class類的getResourceAsStream方法來載入資源文件:
通常用得較多的是JdbcUtil.class.getResourcrAsStream("/database.properties");
public InputStream getResourceAsStream(String pathToConfigFile);
該方法接收一個String類型的參數(pathToConfigFile)來表示資源文件的地址,如果載入成功,則返回該資源文件的輸入流(InputStream),如果失敗,則返回null。
重要的是,在傳入pathToConfigFile參數時,有兩種方式,
第一種方式為絕對定位方式,即pathToConfigFile以"/"開頭,此時Java以classpath為根目錄,直接加上pathToConfigFile來搜索資源文件。
第二種方式為相對定位方式,即pathToConfigFile不以"/"開頭,此時資源文件的全路徑應該為:調用getResourceAsStream方法的類的package路徑加上pathToConfigFile。(在將package轉為目錄時將"."變成"/")
(二)用ClassLoader類載入資源文件
ClassLoader類也提供和Class類相同的載入方法:
public InputStream getResourceAsStream(String pathToConfigFile);
用ClassLoader載入配置文件時,pathToConfigFile均不能以"/"開頭,在查找時直接在classpath下進行查找。Class類在查找資源文件時,也是代理(delegate)給ClassLoader完成查找功能的,請參考Java官方文檔。
InputStream input = this.getClass().getClassLoader().getResourceAsStream("resources/config.properties");
InputStream input = ClassLoader.getSystemResourceAsStream("resources/config.properties");
InputStream input = ClassLoader.getSystemClassLoader().getResourceAsStream("resources/config.properties");