`
AnonymMan
  • 浏览: 23627 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中ClassLoader和Class的getResource()和getResourceAsStream()方法

    博客分类:
  • Java
 
阅读更多

    虽然网上关于ClassLoader和Class的getResource()和getResourceAsStream()方法的区别多的数不胜数,但是自己也遇到了这个问题,所以就记录了下来。

 

     背景:昨日由于项目中要使用ehcache缓存,所以本人新建了个Java Project。写个ehcache缓存对象的demo,于是在网上找了个例子,第一步是

      CacheManager cacheManager = CacheManager.getInstance();

      Cache cache = cacheManager.getCache(cacheName);

     

看完第一行代码感觉非常好奇。我的ehcache.xml放到src下,CacheManager.getInstance()时是怎么加载ehcache.xml的,于是打开ehcache的源码,发现在最后是有解析ehcache.xml的代码,如下图:



 



 

 

   由上图可以看到ehcache在找ehcache.xml的时候默认是先使用ClassLoader.getResource(),如果用ClassLoader的方式获取的Url为null的话,再使用Class.getResource(),但是ClassLoader的getResource()方法和Class的getResource()方法到底有什么区别呢?于是自己分别用这两种方式去测试(我新建的Java项目,默认classes文件在项目下/bin/下,ehcache.xml在src下)。

 

测试代码如下:

 

        URL resource = Thread.currentThread().getContextClassLoader().getResource("ehcache.xml");
        System.out.println(resource);

        System.out.println("-------------------------");

        InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("ehcache.xml");
        System.out.println(resourceAsStream);

        System.out.println("-------------------------");

        InputStream resourceAsStream1 = Test.class.getClassLoader().getResourceAsStream("ehcache.xml");
        System.out.println(resourceAsStream1);

        System.out.println("-------------------------");

        URL resource2 = Test.class.getResource("/ehcache.xml");
        System.out.println(resource2);

        System.out.println("-------------------------");

        InputStream resourceAsStream2 = Test.class.getResourceAsStream("/ehcache.xml");
        System.out.println(resourceAsStream2);

        System.out.println("-------------------------");

 

 

 

结果输出:

 

 

file:/E:/MyEclipse/MyEclipse4Spring2013WorkSpace/workspace/cacheTest/bin/ehcache.xml
-------------------------
java.io.BufferedInputStream@40a0dcd9
-------------------------
java.io.BufferedInputStream@1034bb5
-------------------------
file:/E:/MyEclipse/MyEclipse4Spring2013WorkSpace/workspace/cacheTest/bin/ehcache.xml
-------------------------
java.io.BufferedInputStream@7f5f5897
-------------------------

以上用ClassLoader和Class方式的getResource()和getResourceAsStream()方法都能找到ehcache.xml文件。但是仔细观察你会发现,ClassLoader的getResource()和getResourceAsStream()方法中的参数都不带"/",而Class方式的都带“/”。如果ClassLoader方式的加上"/"的话,会无法找到,Class方式的去掉"/"的话也不能找到。(可自行测试)

 

另附上不加任何文件名的方式测试:

 

        System.out.println(Test.class.getResource("/"));
        System.out.println(Test.class.getResource(""));
        System.out.println(Test.class.getClassLoader().getResource(""));
        System.out.println(Thread.currentThread().getContextClassLoader().getResource(""));

  

结果:

file:/E:/MyEclipse/MyEclipse4Spring2013WorkSpace/workspace/cacheTest/bin/
file:/E:/MyEclipse/MyEclipse4Spring2013WorkSpace/workspace/cacheTest/bin/com/cache/test/
file:/E:/MyEclipse/MyEclipse4Spring2013WorkSpace/workspace/cacheTest/bin/
file:/E:/MyEclipse/MyEclipse4Spring2013WorkSpace/workspace/cacheTest/bin/

 

 

结论:

1、ClassLoader的getResource()和getResourceAsStream()方法找的是classpath根目录下的resource(注意不能带"/")。

2、Class的getResource()和getResourceAsStream()方法不带"/"的话找到的是当前类的同目录路径。带上"/"的话找到的是classpath根目录路径。

 

 

PS:Test.class.getProtectionDomain().getCodeSource().getLocation().getPath(); 这样也可以获取到classpath的绝对路径。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    

  • 大小: 33.2 KB
  • 大小: 22.7 KB
分享到:
评论

相关推荐

    java classloader classpath 张孝祥

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

    java文件路径获取

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

    Java-recourse.rar_java读取recouse

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

    Java 读取资源文件

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

    java类动态获取相对路径

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

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

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

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

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

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

    - 除了通过类的`getResource()`方法外,还可以通过`ClassLoader`来获取资源: ```java String f = Hello.class.getClassLoader().getResource("4.txt").getPath(); ``` - 需要注意的是,这种方式同样只能获取到...

    读取war包或jar包内的文件

    2. **getResource() 和 getResourceAsStream()**: 这两个方法是ClassLoader和类的Class对象提供的。`getResource()`返回一个URL,用于定位资源的路径;`getResourceAsStream()`则返回一个InputStream,可以直接读取...

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

    通过上述介绍可以看出,在Java中获取文件路径的方法多种多样,每种方法适用于不同的场景。掌握这些技巧对于编写高效、稳定的Java应用程序至关重要。在实际开发过程中,可以根据具体需求选择最适合的方法来获取文件...

    JAVA获取各种路径总结

    - **使用 `getResource` 和 `getResourceAsStream` 方法** - 示例: - `getClass().getResourceAsStream(filePath);` (`filePath` 例如为 "/filename",默认从 WEB-INF/classes 开始查找,适用于 Tomcat 等容器...

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

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

    扫描Class文件的方法

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

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

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

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

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

    java 静态代码块通过类加载器获取资源文件例子

    在获取资源文件时,我们通常会使用类加载器的getResource()或getResourceAsStream()方法。这两个方法可以从类路径中查找指定的资源文件,并返回一个URL对象或输入流,便于我们进一步处理。例如,获取名为"config....

    Java读取.properties文件 的四种方法

    在这个例子中,我们创建一个`Properties`对象,然后通过`getResourceAsStream`方法获取类路径下的`config.properties`文件的输入流,接着调用`load`方法加载文件内容。`getProperty`方法用于获取指定键对应的属性值...

    读取jar文件

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

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

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

Global site tag (gtag.js) - Google Analytics