`
足至迹留
  • 浏览: 496894 次
  • 性别: Icon_minigender_1
  • 来自: OnePiece
社区版块
存档分类
最新评论

Class(ClassLoader)#getResource, getResourceAsStream

阅读更多
一、Class#getResourceAsStream
1.1 JDK定义
public InputStream getResourceAsStream(String name)

查找具有给定名称的资源。查找与给定类相关的资源的规则,是通过定义类的 class loader 实现的。此方法委托此对象的类加载器。如果此对象通过引导类加载器加载,则此方法将委托给 ClassLoader.getSystemResourceAsStream(java.lang.String)。

在委托前,使用下面的算法从给定的资源名构造一个绝对资源名:
(1)如果 name 以 '/' 开始 ('\u002f'),则绝对资源名是 '/' 后面的 name 的一部分。

(2)否则,绝对名具有以下形式:
  modified_package_name/name
其中 modified_package_name 是此对象的包名,该名用 '/' 取代了 '.' ('\u002e')。

参数:
name - 所需资源的名称
返回:
一个 InputStream 对象;如果找不到带有该名称的资源,则返回 null
抛出:
NullPointerException - 如果 name 是 null
从以下版本开始:
JDK1.1

此方法参数是与getResouce()方法一样的,它相当于你用getResource()取得File文件后,再new InputStream(file)一样的结果。

二、Class#getResource
2.1 JDK定义
[url]public URL getResource(String name)[/url]
查找带有给定名称的资源。查找与给定类相关的资源的规则是通过定义类的 class loader 实现的。此方法委托给此对象的类加载器。如果此对象通过引导类加载器加载,则此方法将委托给 ClassLoader.getSystemResource(java.lang.String)。

在委托前,使用下面的算法从给定的资源名构造一个绝对资源名:
(1)如果 name 以 '/' ('\u002f') 开始,则绝对资源名是 '/' 后面的 name 的一部分

(2)否则,绝对名具有以下形式:
modified_package_name/name
其中 modified_package_name 是此对象的包名,该名用 '/' 取代了 '.' ('\u002e')。
参数:
name - 所需资源的名称
返回:
一个 URL 对象;如果找不到带有该名称的资源,则返回 null
从以下版本开始:
JDK1.1

2.2 举例说明
包路径:


Ehcache.java的内容:
public static void main(String[] args)
	{
         // 1输出: /E:/anWorkSpace/pra_test/target/classes/com/anning/cache/
		System.out.println(Ehcache.class.getResource("").getFile());  

         // 2输出: /E:/anWorkSpace/pra_test/target/classes/
		System.out.println(Ehcache.class.getResource("/").getFile()); 
	
// 3输出: /E:/anWorkSpace/pra_test/target/classes/conf/ehcache.xml	System.out.println(Ehcache.class.getResource("/conf/ehcache.xml").getFile()); 

// 4输出: null
System.out.println(Ehcache.class.getResource("conf/ehcache.xml"));
		
	}


解释:
1.路径开头不带”/”的会当做是相对当前类(class文件)的文件路径,比如第一行输出没有指明任何文件,而且路径开头不带”/”,则取得的是当前class的路径,也就是包路径。
第4行输出则找不到文件,因为不带”/”,所以是相对当前class的相对路径,从图中我们可以看到ehcache.class的包路径下没有conf/ehcache.xml文件。

2.路径开头带”/”的是绝对路径,是相对classpath的路径。如第二行的输出,classpath就是/E:/anWorkSpace/pra_test/target/classes/。
第三行的输出就是相对classpath路径,加上绝对路径的”/”后面的部分。

总结
可以看到Class的这两个方法都是跟ClassLoader相关的,也就是跟class的路径和classpath路径相关。这与开发工具IDE无关,请看下面:
比如在上面的main方法里写写new File就要写成:
new File(“src/main/resources/conf/ehcache.xml”);

才可以在IDE环境下运行main方法。但是发布打包之后这又要报错找不到文件,为什么呢?因为IDE里File的相对路径是相对IDE的工程根路径,也就是System.getProperties(“user.dir”)的路径。
new File(path),这个方法的路径到底在那里取决于调用java命令的起始位置定义在哪里,tomcat/bin下面的catalina.bat调用了java,所以在tomcat下相对起始位置是tomcat/bin,但是eclipse启动时,起始位置是eclipse的项目路径。

三、ClassLoader#getResource
3.1 JDK定义
public URL getResource(String name)
查找具有给定名称的资源。资源是可以通过类代码以与代码路径无关的方式访问的一些数据(图像、声音、文本等)。
资源名称是以 '/' 分隔的标识资源的路径名称。
此方法首先搜索资源的父类加载器;如果父类加载器为 null,则搜索的路径就是虚拟机的内置类加载器的路径。如果搜索失败,则此方法将调用 findResource(String) 来查找资源。
参数:
name - 资源名称
返回:
读取资源的 URL 对象;如果找不到该资源,或者调用者没有足够的权限获取该资源,则返回 null。
从以下版本开始:
1.1

3.2 举例说明
Ehcache.java的内容:
public static void main(String[] args)
	{
         // 1输出: file:/E:/anWorkSpace/pra_test/target/classes/
		System.out.println(Ehcache.class.getClassLoader().getResource(""));
         
         // 2输出: null
		System.out.println(Ehcache.class.getClassLoader().getResource("/"));
		

//3输出:file:/E:/anWorkSpace/pra_test/target/classes/conf/ehcache.xml
System.out.println(Ehcache.class.getClassLoader().getResource("conf/ehcache.xml"));		
	}

可以看出通过classLoader获取classpath的参数跟Class的不太一样。但原理基本一致,因为Class的方法是调用ClassLoader的对应方法实现的,只是入参做了点点处理。
ClassLoader把决定权交给了类加载器,例如tomcat的类加载是非委托机制的,而weblogic的类加载是委托的。

ClassLoader的getResourceAsStream方法与它的getResource方法的关系跟Class的两个方法是一样的。

还可以参考:
http://blog.csdn.net/fancylovejava/article/details/7577294
http://blog.sina.com.cn/s/blog_9386f17b0100w2vv.html
http://lavasoft.blog.51cto.com/62575/265821/
http://lavasoft.blog.51cto.com/62575/265821/
http://www.iteye.com/topic/483115
最后一篇提到,可以使用XWork的工具类ClassLoaderUtil读取jar包里的资源文件等。
  • 大小: 6.2 KB
0
0
分享到:
评论

相关推荐

    java文件路径获取

    - 当使用`Class.getResource`或`Class.getResourceAsStream`时,如果路径不以 `/` 开头,那么查找将从调用该方法的类所在的包开始。 - 当使用`ClassLoader.getResource`或`ClassLoader.getResourceAsStream`时,路径...

    java classloader classpath 张孝祥

    #### 四、`getResource`和`getResourceAsStream`方法 ##### 4.1 方法介绍 `ClassLoader`提供了两个重要的方法用于资源定位: - `public URL getResource(String name)`:返回一个`URL`对象,表示名为`name`的资源...

    SpringBoot如何读取war包jar包和Resource资源

    在读取资源文件时,经常使用 Class.getResource() 或 ClassLoader.getResource() 方法。两种方法都可以读取资源文件,但是它们的使用场景和返回值不同。 Class.getResource() 方法返回 URL 对象,表示资源文件的...

    Java 读取资源文件

    1. 使用`Class.getResource()`和`Class.getResourceAsStream()` - `Class.getResource(String path)`方法返回一个`URL`对象,表示相对于当前类的类路径上的资源的位置。例如,如果你有一个名为`config.properties`...

    JAVA获取文件绝对路径的方法

    当你需要获取与类相关的资源文件的绝对路径时,可以使用 `Class.getResource()` 或 `Class.getResourceAsStream()` 方法。这些方法返回一个 `java.net.URL` 对象,可以通过调用 `getPath()` 来获取路径字符串。例如...

    java类动态获取相对路径

    `ClassLoader`提供了`getResource`和`getResourceAsStream`方法来获取资源的URL或输入流。例如,如果我们有一个名为`res.txt`的文件与`MyClass`同级,可以这样获取其URL: ```java URL resourceUrl = classLoader...

    扫描Class文件的方法

    2. **使用ClassLoader资源流**:通过`ClassLoader.getResource()`或`getResourceAsStream()`获取类路径上的资源,这种方法适用于JAR文件或被打包的Class文件。 3. **Java SPI服务发现**:通过`java.util....

    从java jar文件包中读资源的常用方法

    从Java JAR文件包中读取资源是Java...通过合理利用`getResource`和`getResourceAsStream`等方法,结合正确的资源路径和类加载器,可以高效地实现这一目标。理解这些概念对于构建可移植且健壮的Java应用程序至关重要。

    Java-recourse.rar_java读取recouse

    你可以通过`Thread.currentThread().getContextClassLoader().getResource()`或`YourClass.class.getResource()`来获取`URL`对象,然后使用`InputStream`读取资源内容。例如: ```java URL resource = getClass()....

    读取jar文件

    - **方法**:类加载器提供了`getResource`和`getResourceAsStream`等方法用于查找和读取资源。 2. **资源文件的路径表示**: - 在jar包内部,资源文件的路径通常是以`/`开头的相对路径表示。例如,如果资源文件...

    JAVA中如何得到文件路径.pdf

    System.out.println(Test.class.getClassLoader().getResource("")); ``` 4. **使用`ClassLoader.getSystemResource("")`**: - 获取系统类加载器的资源路径。 - 示例代码: ```java System.out.println...

    java中File的相对路径与绝对路径总结

    String f = Hello.class.getClassLoader().getResource("4.txt").getPath(); ``` - 需要注意的是,这种方式同样只能获取到类路径中的资源。 #### 注意事项 - **使用相对路径时**,务必确保路径的正确性,否则...

    Tomcat 5.0.18 ClassLoader source code insight

    `WebappClassLoader`实现了`getResource`和`getResourceAsStream`方法,以便于获取Web应用中的资源。 4. **同步机制**:为了保证并发环境下的安全,`WebappClassLoader`使用锁机制来控制对类加载的访问,避免了多...

    附带资源的jar包

    当需要在运行时动态加载资源时,还可以使用`ClassLoader.getResource()`或`ClassLoader.getResourceAsStream()`,这样可以利用当前线程的上下文类加载器,适应更复杂的类加载环境。 在打包过程中,确保资源被正确...

    jar包中类的加载及jar中资源的使用

    1. `getResourceAsStream()`:通过`ClassLoader`的`getResourceAsStream()`方法,可以获取`jar`包内的资源文件的输入流,例如`getClass().getResourceAsStream("/config.properties")`。 2. `getResource()`:返回...

    Java路径问题最终解决方案之一.txt

    这种类型的路径在使用`ClassLoader`的`getResource`或`getResourceAsStream`方法时特别有用。 4. **相对于当前用户目录的相对路径**:这类路径基于`System.getProperty("user.dir")`返回的值。对于大多数项目而言...

    IOUtils组件,搭配本文项目专用

    这段代码首先通过`Thread.currentThread().getContextClassLoader().getResource()`或`getResourceAsStream()`方法找到类路径下的资源,然后使用IOUtils的`toString()`方法将输入流转换为字符串,这样就能方便地读取...

    Java路径问题最终解决方案.doc

    在Java中,可以使用ClassLoader的`getResource()`和`getResourceAsStream()`方法,以相对路径的方式查找类路径下的资源。 四、相对于当前用户目录的相对路径 例如:相对于System.getProperty("user.dir")返回的路径...

    java文件路径操作详细[归类].pdf

    例如,`ClassLoader`类的`getResource(String name)`和`getResourceAsStream(String name)`方法,以及`ResourceBundle`类的`getBundle(String path)`都是基于此类路径查找资源。 然而,尽管相对路径在使用上更为...

Global site tag (gtag.js) - Google Analytics