getResources()方法读取jar包内部的文件

原创 2015年07月07日 09:54:59

说明

通过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的症结所在了。


版权声明:本文为博主原创文章,未经博主允许不得转载。

JavaIO——java如何读取jar包自身内部的属性文件

JAR文件是打包基于JAVA技术的解决方案的标准方法。它允许开发者将所有相关内容(.class、图片、声音、及所有支持的文件)打包到一个文件中。JAR格式支持压缩、认证、版本号及其他很多特性。   ...
  • Ididcan
  • Ididcan
  • 2011年09月29日 09:00
  • 8527

Java GUI项目读取Jar内部外部文件 打包EXE 在没有java环境的电脑上可运行

本文记录我最近一个业余swing swt项目中遇到的问题及解决办法,主要问题有三点: 1. Jar包内部外部文件读取问题 2. 打包为EXE问题 3. 在没有java环境的电脑上使用问题 ...
  • jpmf007
  • jpmf007
  • 2016年12月23日 12:17
  • 936

获取jar包内部的资源文件

这里记录了由于读取jar文件内部资源问题而引起的两个需求,一个可以通过类加载器的getResourceAsStream绕开,另一个可以利用类加载器的getResource("/")方法永远返回当前工程...

黑马程序员——面向对象(二)---类的继承、多态性、匿名内部类、异常、包、访问控制、命名规范、jar文件

第一部分 类的继承 一.概述 1.通过继承可以简化类的定义 。 2.Java只支持单继承,不允许多重继承。  3.可以有多层继承,即一个类可以继承某一个类的子类,如类B继承了类A,类C又可以继...

读取jar包中资源文件的两种方法

一、构造url // 生成资源URL://jar:file:/D:\workspace\project\test.jar!/plugin.xml URL fileURL = new URL("ja...
  • a1s2d3q
  • a1s2d3q
  • 2015年08月10日 19:29
  • 242

Android手机数据读写方法(内部存储、SD卡,网络加载,包内文件读取)

本次实例以文本和图片为例,展示了Android手机内部存储的读写方法、SD卡的读写方法,包内文件的读取,以及网络文本及图片的加载与下载。     项目文件在此:文档下载传送门 从网络加载图片或保存到...

JAR内class读取内外部文件方法

我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等)。在单独运行的时候这些简单的处理当然不会有问题。但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了。看看...
  • piccasi
  • piccasi
  • 2014年09月27日 00:46
  • 426

Idea 将新写的项目中的一个java文件搞成jar包方法

啥都不说,come on!先新建一个java项目,这边不做介绍 然后在src下面自己建使用的方法吧 然后开始打包: 在File->Project Structure->Artifacts,如图:...

dom4j读写xml文件方法和具体实现代码(提供jar包下载)

dom4j读写xml文件以及dom4j的jar包下载

java 从jar中读取文件 三种方法<Enumeration>

Sample1-利用Manifest文件读取jar中的文件 1.文件目录 test--      --a.text      --b.gif 2. Menifest文件内容: Ma...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:getResources()方法读取jar包内部的文件
举报原因:
原因补充:

(最多只允许输入30个字)