getResources()方法讀取jar包內部的文件

說明

通過class的getResources()方法,加載文件,四種寫法,其中 this.getClass()和 PEData.class是相同的,以下以this來進行調試

1  this.getClass().getResource("/");

2  this.getClass().getClassLoader().getResource("/");

3  PEData.class.getResource("/");

4  PEData.class.getClassLoader().getResource("/");

case分析—以hty項目的bg爲例

一 當前項目信息

1 classes根目錄  file:/D:/hty/htyWork/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/htybg/WEB-INF/classes/

   jar       根目錄  file:/D:/hty/htyWork/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/htybg/WEB-INF/lib/htydb-0.0.1-SNAPSHOT.jar!/

2 PEData.json文件打包在db.jar根目錄下,PEData2.json存放在bg的classes目錄下

3 當前方法所在的類文件的位置爲 

   file:/D:/hty/htyWork/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/htybg/WEB-INF/

   lib/htydb-0.0.1SNAPSHOT.jar!/com/hetaosoft/yun/base/util/PEData.class

4 註釋中 null表示文件不存在,jar表示讀取的文件位於db.jar中,file表示讀取的文件位於bg運行的classes目錄中

二 this.getClass()

1 this.getClass().getResource("/");//file

   file:/D:/hty/htyWork/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/htybg/WEB-INF/classes/

   “ / ”斜線所表示的目錄爲bg的類的class文件的存放路徑,但是查找文件時兩個根目錄都會找

2 this.getClass().getResource("../");//null

   當前的路徑不能通過“ ../ ”向上查找,但是可以向下查找

3 this.getClass().getResource("PEData.json");//null

   不加斜線找當前的class文件所在jar中的位置,無法向上找獲取到jar文件的根目錄,但可以向下查找,參見:例8

4 this.getClass().getResource("/PEData.json");//jar

   加斜線,會從兩個根目錄下查找文件,在db.jar的根目錄中有PEData.json文件

5 this.getClass().getResource("PEData2.json");//null

   不加斜線找當前的class文件所在jar中的位置

6 this.getClass().getResource("/PEData2.json");//file

   加斜線,會從兩個根目錄下查找文件,在classes的根目錄中有PEData2.json文件

7 this.getClass().getResource("Page.class");//jar

  不加斜線找當前的class文件所在jar中的位置,page.class位於當前目錄下,與PEData.class平級

8 this.getClass().getResource("dao/support/HibernateDao.class");//jar

   不加斜線找當前的class文件所在jar中的位置,dao文件夾與PEData.class平級

9 this.getClass().getResource("com/hetaosoft/yun/user/dao/HTYUserDao.class");//null

   不加斜線找當前的class文件所在jar中的位置,無法向上定位到com目錄

10 this.getClass().getResource("/com/hetaosoft/yun/user/dao/HTYUserDao.class");//jar

   加斜線,會從兩個根目錄下查找文件

11 this.getClass().getResource("com/hetaosoft/yun/user/controller/DataController.class");//null

   不加斜線找當前的class文件所在jar中的位置,DataController.class文件位於classes目錄下,找不到

12 this.getClass().getResource("/com/hetaosoft/yun/user/controller/DataController.class");//file

   加斜線,會從兩個根目錄下查找文件

三 this.getClass().getClassLoader()

1 this.getClass().getClassLoader().getResource("/");//file 

   “ / ”斜線所表示的目錄爲bg的類的class文件的存放路徑

2 this.getClass().getClassLoader().getResource("../");//null

  當前的路徑不能通過“ ../ ”向上查找,但是可以向下查找

3 this.getClass().getClassLoader().getResource("PEData.json");//jar

   不加斜線兩個根目錄都會找

4 this.getClass().getClassLoader().getResource("/PEData.json");//null

   加斜線去classes目錄下找,沒有PEData.json

5 this.getClass().getClassLoader().getResource("PEData2.json");//file

   加斜線去classes目錄下找,有PEData2.json

6 this.getClass().getClassLoader().getResource("/PEData2.json");//file

   不加斜線兩個根目錄都會找

7 PEData.class.getClassLoader().getResource("com/hetaosoft/yun/user/controller/DataController.class");//file

   不加斜線兩個根目錄都會找

8 this.getClass().getClassLoader().getResource("/com/hetaosoft/yun/user/controller/DataController.class");//file

   加斜線去classes目錄下找,能找到該文件

9 this.getClass().getClassLoader().getResource("com/hetaosoft/yun/user/dao/HTYUserDao.class");//jar

   不加斜線兩個根目錄都會找,在db.jar中能找到該class文件

四 總結

this.getClass()                                   加斜線兩個根目錄都會找;不加斜線找當前文件所在的jar的位置,不能向上找,可以向下找。

this.getClass().getClassLoader()    加斜線去classes根目錄下找;不加斜線兩個根目錄都會找

問題分析

我們可以成功獲取到jar文件內部的json文件路徑jar:file:/D:/hty/htyWork/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/htybg/WEB-INF/lib/htydb-0.0.1-SNAPSHOT.jar!/PEData.json

但是不能通過File f=new File("上述路徑");來獲取文件

可以通過getResourceAsStream()直接讀取到文件流,再進行操作。

因爲"....."並不是文件資源定位符的格式 (jar中資源有其專門的URL形式: jar:<url>!/{entry}  )。

所以,如果jar包中的類源代碼用File f=new File(相對路徑);的形式,是不可能定位到文件資源的。這也是爲什麼源代碼1打包成jar文件後,調用jar包時會報出FileNotFoundException的癥結所在了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章