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");
 
转载地址:http://blog.csdn.net/bluishglc/article/details/38753047
http://swiftlet.net/archives/868
 

getResource和getResourceAsStream的更多相关文章

  1. 【知识碎片】getResource和getResourceAsStream

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 深入jar包:从jar包中读取资源文件getResourceAsStream

    一.背景 我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等). 在单独运行的时候这些简单的处理当然不会有问题.但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不 ...

随机推荐

  1. Program, Process and Thread

    A program is an executable file store. A process is a running program. A thread is a single sequence ...

  2. Java入门系列-20-异常

    为什么要进行异常处理 下面这段代码能否正常执行 public class DemoCalc { public static void main(String[] args) { int a=0; in ...

  3. 【转】HttpURLConnection用法详解

    原文链接:http://www.blogjava.net/supercrsky/articles/247449.html 针对JDK中的URLConnection连接Servlet的问题,网上有虽然有 ...

  4. [转]MSBuild Target Framework and Target Platform

    本文转自;https://msdn.microsoft.com/en-us/library/hh264221.aspx A project can be built to run on a targe ...

  5. 智能提示含查询多列(html+JS+handler+ HttpRemoting)二、Remoting代码

    /// <summary> /// 智能查询类型 /// </summary> public enum QueryType : byte { /// <summary&g ...

  6. IIS网站不能访问

    摘要:IIS环境下,部署的网站在服务器上可以正常访问,客户端却不能访问. 原因:防火墙入站规则万维网服务没有开启.

  7. jquery ajaxFileUpload异步上传文件

    ajaxFileUpload.js 很多同名的,因为做出来一个很容易. 我用的是这个:https://github.com/carlcarl/AjaxFileUpload 下载地址在这里:http:/ ...

  8. Golang 的 TOML库

    TOML 的全称是 Tom's Obvious, Minimal Language,因为它的作者是 GitHub 联合创始人 Tom Preston-Werner. TOML 的目标是成为一个极简的配 ...

  9. 反编译DLL文件

    我们平时在工作中经常会遇到一些已经被编译后的DLL,而且更加麻烦是没有源代码可以进行修改,只能针对这个DLL的文件进行修改才能得到我们想要的结果:本文将通过一个实例来演示如果完成一个简单的修改;我们将 ...

  10. Python中元组和列表

    一.list列表的操作包括以下函数: 列表操作包括以下函数: 1.cmp(list1,list2) :比较两个列表的元素 2.len(list) :列表元素个数 3.max(list) :返回列表元素 ...