getResources()方法读取jar包内部的文件
2015-07-07 09:54
197 查看
说明
通过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("/");//filefile:/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()[b].getClassLoader()[/b]
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()
4000
.getClassLoader().getResource("com/hetaosoft/yun/user/dao/HTYUserDao.class");//jar
不加斜线两个根目录都会找,在db.jar中能找到该class文件
四 总结
this.getClass() 加斜线两个根目录都会找;不加斜线找当前文件所在的jar的位置,不能向上找,可以向下找。
this.getClass()[b].getClassLoader() [b]加斜线去classes根目录下找;不加斜线两个根目录都会找[/b][/b]
问题分析
我们可以成功获取到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的症结所在了。
相关文章推荐
- ActiveMQ内存设置和流控
- iOS 自定义Set方法,注意点
- 敏捷开发之Scrum扫盲篇
- xcode6.3发布ios app注意事项
- SQL优化_高水位线导致的性能问题
- 【jvm学习】jvm运行时内存分配模型分析
- The method getDispatcherType() is undefined for the type HttpServletRequest
- 31、df 命令
- android中获取图片的缩略图(解决OutOfMemoryError)内存溢出的Bug
- Ubuntu: common errors
- 过孔和焊盘大小
- java.lang.IllegalArgumentException: Document base D:\apache-tomcat-6.0.37\webapps\host-manager does
- 让顶尖设计师教你10个色彩运用秘技,赶紧洗耳恭听吧!
- UIScrollView详解
- 安卓获取手机SIM卡状态
- iOS下的2D仿射变换机制(CGAffineTransform相关)
- ajaxfileupload.js 兼容性问题
- c#的DateTime.Now函数详解
- 实战weblogic集群之安装weblogic
- 技术文档等于产品秘方?