1. 前言

在Java中获取资源的时候,经常用到getResource和getResourceAsStream,本文总结一下这两种获取资源文件的路径差异。

2.Class.getResource(String path)

path不以'/'开头时,默认是从此类所在的包下取资源;

path以'/'开头时,则是从项目的ClassPath根下获取资源。在这里'/'表示ClassPath的根目录。

JDK设置这样的规则,是很好理解的,path不以'/'开头时,我们就能获取与当前类所在的路径相同的资源文件,而以'/'开头时可以获取ClassPath根下任意路径的资源。

如下所示的例子:

  1. public class Test
  2. {
  3. public static void main(String[] args)
  4. {
  5. System.out.println(Test.class.getResource(""));
  6. System.out.println(Test.class.getResource("/"));
  7. }
  8. }

运行结果为:
file:/D:/work_space/java/bin/net/swiftlet/
file:/D:/work_space/java/bin/

3.Class.getClassLoader().getResource(String path)
path不能以'/'开头path是指类加载器的加载范围,在资源加载的过程中,使用的逐级向上委托的形式加载的,'/'表示Boot ClassLoader,类加载器中的加载范围,因为这个类加载器是C++实现的,所以加载范围为null。如下所示:

  1. public class Test
  2. {
  3. public static void main(String[] args)
  4. {
  5. System.out.println(Test.class.getClassLoader().getResource(""));
  6. System.out.println(Test.class.getClassLoader().getResource("/"));
  7. }
  8. }

运行结果为:
file:/D:/work_space/java/bin/
null
从上面可以看出:
class.getResource("/") == class.getClassLoader().getResource("")
其实,Class.getResource和ClassLoader.getResource本质上是一样的,都是使用ClassLoader.getResource加载资源的。下面请看一下jdk的Class源码:

  1. public java.net.URL getResource(String name)
  2. {
  3. name = resolveName(name);
  4. ClassLoader cl = getClassLoader0();
  5. if (cl==null)
  6. {
  7. // A system class.
  8. return ClassLoader.getSystemResource(name);
  9. }
  10. return cl.getResource(name);
  11. }

从上面就可以看才出来:Class.getResource和ClassLoader.getResource本质上是一样的。至于为什么Class.getResource(String path)中path可以'/'开头,是因为在name = resolveName(name);进行了处理:

  1. private String resolveName(String name)
  2. {
  3. if (name == null)
  4. {
  5. return name;
  6. }
  7. if (!name.startsWith("/"))
  8. {
  9. Class c = this;
  10. while (c.isArray()) {
  11. c = c.getComponentType();
  12. }
  13. String baseName = c.getName();
  14. int index = baseName.lastIndexOf('.');
  15. if (index != -1)
  16. {
  17. name = baseName.substring(0, index).replace('.', '/')
  18. +"/"+name;
  19. }
  20. } else
  21. {//如果是以"/"开头,则去掉
  22. name = name.substring(1);
  23. }
  24. return name;
  25. }

 4.Class.getResourceAsStream(String path)

path不以'/'开头时,默认是指所在类的相对路径,从这个相对路径下取资源;

path以'/'开头时,则是从项目的ClassPath根下获取资源,就是要写相对于classpath根下的绝对路径。

举例就明白了:

  1. com
  2. |-github
  3. |-demo
  4. | |-A.class
  5. | |-1.txt
  6. |-B.class
  7. |-2.txt
相对路径:InputStream is= A.class.getResourceAsStream("1.txt");
路径不是以/开头,说明这是一个相对路径,相对的是A.class这个文件,所以,这里的“1.txt”所指的正确位置是与A.class处于同一目录下的1.txt文件,这一文件是存在的,所引不会报错。
如果我们按相对路径的方式通过A去加载2.txt,则路径应该这样描述:
InputStream is= A.class.getResourceAsStream("../2.txt");   
是的,用“.."表示上一级目录。
绝对路径:
InputStream is= A.class.getResourceAsStream("/com/github/demo/1.txt");
 5.Class.getResourceAsStream(String path)
Class.getClassLoader.getResourceAsStream(String path) :默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。
如果以‘/’ 开头,则 返回的是classLoader加载器Boot ClassLoader的加载范围,所以返回的也是null,所以不能以 / 开头。
class.getResourceAsStream最终调用是ClassLoader.getResourceAsStream,这两个方法最终调用还是ClassLoader.getResource()方法加载资源。所以上面的规则也适用于此。
事例:
InputStream resourceAsStream = ClassLoader.getSystemResourceAsStream("com/github/demo/1.txt");
 
转载地址:
https://www.cnblogs.com/haitaofeiyang/p/7737360.html
http://blog.csdn.net/bluishglc/article/details/38753047
http://swiftlet.net/archives/868

【知识碎片】getResource和getResourceAsStream的更多相关文章

  1. IOS开发基础知识碎片-导航

    1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...

  2. getResource和getResourceAsStream

    1. 前言 在Java中获取资源的时候,经常用到getResource和getResourceAsStream,本文总结一下这两种获取资源文件的路径差异. 2.Class.getResource(St ...

  3. [转]getResource()和getResourceAsStream以及路径问题

    原文链接:http://blog.sina.com.cn/s/blog_4b5bc0110100g22w.html 用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还是掌握颇浅,用起来感觉 ...

  4. getResource()和getResourceAsStream以及路径问题【转】【补】

    一 getResource 用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还是掌握颇浅,用起来感觉颇深,大常最经常用的,就是用JAVA的File类,如要取得c:/test.txt文件,就 ...

  5. getResource()和getResourceAsStream以及路径问题

    用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还是掌握颇浅,用起来感觉颇深,大常最经常用的,就是用JAVA的File类,如要取得c:/test.txt文件,就会这样用File file ...

  6. getResource()和getResourceAsStream以及路径问题(转)

    用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还是掌握颇浅,用起来感觉颇深,大常最经常用的,就是用JAVA的File类,如要取得c:/test.txt文件,就会这样用File file ...

  7. class.getResource()和getResourceAsStream的用法

    转自:http://blog.csdn.net/lcj8/article/details/3502849 class.getResource()的用法 用JAVA获取文件,听似简单,但对于很多像我这样 ...

  8. java读取配置文件的推荐方法getResource、getResourceAsStream

    在java开发中经常会读取配置文件,如果把文件路径写死,就太LOW了,也不符合编码规范. 在网上找了一些资料后,发现有两种方法:xxx.class.getResource("")  ...

  9. getResource()和getResourceAsStream()以及路径问题

    用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还是掌握颇浅,用起来感觉颇深,大常最经常用的,就是用JAVA的File类,如要取得c:/test.txt文件,就会这样用File file ...

随机推荐

  1. 模块,import,from xxx import xxx

    一,模块 模块就是一个包含了python定义和声明的文件,文件名就是模块的名字加上.py后缀,总体来说,import加载的模块一共分成四个通用的类别: 1,使用python编写的py文件 2,已被变异 ...

  2. jQuery学习(1)猜数字游戏

      jQuery是一个快捷.小型且特征丰富的JavaScript库.它使得HTML文档遍历及操作,事件处理,动画,Ajax等更简洁方便.它通过调用一个简单易用的API,就能在各种浏览器中使用.由于jQ ...

  3. LInux Crontab及命令

    定时任务(cron job)被用于安排那些需要被周期性执行的命令.利用它,你可以配置某些命令或者脚本,让它们在某个设定的时间内周期性地运行.cron 是 Linux 或者类 Unix 系统中最为实用的 ...

  4. (2)Jquery1.8.3快速入门_checkbox全选取消部分选中

    1. jquery示例功能: checkbox多选框 全选 .全不选. 选择部分. 源码 : <!DOCTYPE html> <html> <head> <m ...

  5. MySQL分库分表浅谈

    一.分库分表类型 1.单库单表 所有数据都放在一个库,一张表. 2.单库多表 数据在一个库,单表水平切分多张表. 3.多库多表 数据库水平切分,表也水平切分. 二.分库分表查询 通过分库分表规则查找到 ...

  6. APP接口调用流程

  7. Jmeter进阶篇之监控服务器cpu,内存

    对于Jmeter,可以不再赘述,因为介绍得也够多了. 那么相信有部分同学已经尝试着自主去学习如果使用Jmeter对服务器进行压力测试了. 但是可能也会发现,Jmeter好像监控不了服务器的cpu已经内 ...

  8. loadrunner 脚本开发-参数化之将内容保存为参数、参数数组及参数值获取Part 2

    脚本开发-参数化之将内容保存为参数.参数数组及参数值获取 by:授客 QQ:1033553122 ----------------接 Part 1--------------- 把内容保存到参数数组 ...

  9. Element隐藏组件:scrollbar

    scrollbar是用来替代浏览器原生滚动条的组件,element的文档中并没有对scrollbar的描述. 使用方法:以<el-scrollbar/>包裹要滚动的元素,并设置固定高度.在 ...

  10. android 事件反拦截

    有一种方法可以阻止父层的View截获touch事件,就是调用 getParent().requestDisallowInterceptTouchEvent(true);方法.一旦底层View收到tou ...