Maven項目讀取resources下文件的路徑問題(getClassLoader的作用)


 

讀取resources下文件的方法

網上有問答如下:
問:
  new FileInputStream("src/main/resources/all.properties")
  new FileInputStream("./src/main/resources/all.properties")
  上面兩個無法讀取maven下資源文件目錄下的文件嘛,總是提示找不到該路徑,這么寫錯了嘛,但是我的其他maven可以讀取

答:
  要取編譯后的路徑,而不是你看到的src/main/resources的路徑。如下:
  URL url = MyTest.class.getClassLoader().getResource("conf.properties");
  File file = new File(url.getFile());
  或者
  InputStream in = MyTest.class.getClassLoader().getResourceAsStream("conf.properties");

 

第二種方法,也可以改成
  InputStream in = getClass().getClassLoader().getResourceAsStream("conf.properties");

同事的一種的寫法是:
  InputStream in = getClass().getResourceAsStream("conf.properties");
  然后怎么也獲取不到,最后才發現,只要添加了.getClassLoader()就可以了

 

getClassLoader() 的作用

  getClass():取得當前對象所屬的Class對象
  getClassLoader():取得該Class對象的類裝載器
  類裝載器負責從Java字符文件將字符流讀入內存,並構造Class類對象,在你說的問題那里,通過它可以得到一個文件的輸入

Class.getClassLoader()的一個小陷阱,空指針異常
  昨天我的code總在Integer.class.getClassLoader().getResource("*********");這一句拋出空指針異常,定位為getClassLoader()返回null,查了一下jdk的文檔,原來這里還有一個陷阱:
  這里jdk告訴我們:如果一個類是通過bootstrap 載入的,那我們通過這個類去獲得classloader的話,有些jdk的實現是會返回一個null的,比如說我用 new Object().getClass().getClassLoader()的話,會返回一個null,這樣的話上面的代碼就會出現NullPointer異常.所以保險起見我們最好還是使用我們自己寫的類來獲取classloader("this.getClass().getClassLoader()“),這樣一來就不會有問題。

 

參考鏈接:
[1]http://www.oschina.net/question/2935586_2218431
[2]http://blog.sina.com.cn/s/blog_6ec6be0e01011xof.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM