Java讀取Properties設定檔幾點注意事項__Java

來源:互聯網
上載者:User
ava裡載入Properties檔案都是通過Java.util包裡的Properties類的load()方法來載入一個Properties設定檔,load()方法需要接收一個檔案輸入資料流,而InputStream的構建需要Java.io.File對象,即new FileInputStream(new File(path));現在問題就集中在如何動態擷取

ava裡載入Properties檔案都是通過Java.util包裡的Properties類的load()方法來載入一個Properties設定檔,load()方法需要接收一個檔案輸入資料流,而InputStream的構建需要Java.io.File對象,即new FileInputStream(new File(path));現在問題就集中在如何動態擷取這個路徑。
下面以一個樣本來說明吧。如圖:

 

現在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檔案到記憶體去了呢。具體請看圖:

 

也就是說,如圖所示紅色方框表示的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為根目錄。
        看似簡單的一個問題,如果深入的話,就不簡單了。以後再遇到這種問題,就不會犯迷糊咯,哈哈~~~~~
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.