1. 程式人生 > 程式設計 >Maven專案讀取resources檔案路徑問題解決方案

Maven專案讀取resources檔案路徑問題解決方案

讀取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()“),這樣一來就不會有問題。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。