Java讀取Properties配置文件幾點注意事項

Java里加載Properties文件都是經過Java.util包裏的Properties類的load()方法來加載一個Properties 配置文件,load()方法須要接收一個文件輸入流,而InputStream的構建須要Java.io.File對象,即new FileInputStream(new File(path));如今問題就集中在如何動態獲取這個路徑。
下面以一個示例來講明吧。如圖:java

 ActionFactory類圖示

如今ActionFactory類裏須要讀取src目錄下的config.properties文件。咱們知道,java web項目編譯後src目錄對應的是應該是WEB-INF下的classes目錄,因此咱們能夠先獲取到ActionFactory.class文件,再 根據相對路徑採用../一步一步返回上一級獲得config.properties文件的路徑,因而有了第一種寫法:
InputStream stream = this.getClass().getResourceAsStream("../../../../config.properties");//這裏的this指的是ActionFActory類
pro.load(stream);
固然咱們也能夠經過類加載器根據一個相對路徑返回一個文件輸入流,即ClassLoader的getResourceAsStream方法。咱們知道項目 裏的全部java文件編譯後最終都是相對於WEB-INF下的classes目錄存放的,而config.properties文件發佈後的路徑恰好是以 classes目錄爲根目錄。
因此咱們經過項目裏的類獲取類加載器從而獲得文件流,因而又有了第二種寫法:
InputStream stream = this.getClass().getClassLoader().getResourceAsStream("config.properties");
pro.load(stream);
注意這裏的this指的是ActionFActory類,固然你能夠把它換成項目裏的其餘自定義類,由於項目裏類雖不一樣,但都是使用的同一類
加載器。可是還要注意一點的是,注意我上面綠色標識的內容,是其餘自定義類,而不能換成其餘任意類。好比java.lang.Thread類就不行。這是 你確定會有這個疑問:爲何經過Thread類得不到類加載器?這個還得從JVM加載類提及。JVM啓動時會首先使用JVM默認的系統類加載器幫咱們加載 一些jar,那到底JVM都自動幫咱們加載了那些JAR文件到內存去了呢?具體請看圖:web

 所需jar包

也就是說,如圖所示紅色方框表示的jar裏的全部類.getClassLoader()獲得的都是null,由於它們都是由JVM系統類加載器加載的,而Java的安全機制是不容許你獲取系統類加載器對象的。
理解了上面那些,那咱們還能夠這樣寫:
InputStream stream=Thread.currentThread().getClass().getResourceAsStream("/config.properties");
但不能這樣寫:
InputStream stream = Thread.currentThread().getClass().getClassLoader().getResourceAsStream("config.properties");
但能夠這樣寫:
InputStream stream = this.getClass().getClassLoader().getResourceAsStream("config.properties");
InputStream stream = new FileInputStream("/config.properties");  //相對於項目web-inf/classes目錄
爲何 我就再也不解釋了吧。
若是是在web項目中,咱們還能夠這樣寫:
InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties");
不過servlet已經幫咱們封裝了,咱們通常這樣寫:
ServletContext.getRealPath("/")  這裏的斜槓是相對與項目部署後的WebRoot爲根目錄。
        看似簡單的一個問題,若是深刻的話,就不簡單了。之後再遇到這種問題,就不會犯迷糊咯,哈哈~~~~~
安全

相關文章
相關標籤/搜索