关于Class.getResource和ClassLoader.getResource的路径问题

Java中取资源时,经常用到Class.getResource和ClassLoader.getResource,这里来看看他们在取资源文件时候的路径问题。

转自:http://www.cnblogs.com/yejg1212/p/3270152.html

Class.getResource(String path)

path不以’/‘开头时,默认是从此类所在的包下取资源;
path  以’/‘开头时,则是从ClassPath根下获取;

什么意思呢?看下面这段代码的输出结果就明白了:

package testpackage;
public class TestMain {
    public static void main(String[] args) {
        System.out.println(TestMain.class.getResource(""));
        System.out.println(TestMain.class.getResource("/"));
    }
}

输出结果:

file:/E:/workspace/Test/bin/testpackage/
file:/E:/workspace/Test/bin/

上面说到的【path以’/‘开头时,则是从ClassPath根下获取;】在这里就是相当于bin目录(Eclipse环境下)。

再来一个实例,假设有如下Project结构:

如果我们想在TestMain.java中分别取到1~3.properties文件,该怎么写路径呢?代码如下:

package testpackage;

public class TestMain {

    public static void main(String[] args) {
        // 当前类(class)所在的包目录
        System.out.println(TestMain.class.getResource(""));
        // class path根目录
        System.out.println(TestMain.class.getResource("/"));

        // TestMain.class在<bin>/testpackage包中
        // 2.properties  在<bin>/testpackage包中
        System.out.println(TestMain.class.getResource("2.properties"));

        // TestMain.class在<bin>/testpackage包中
        // 3.properties  在<bin>/testpackage.subpackage包中
        System.out.println(TestMain.class.getResource("subpackage/3.properties"));

        // TestMain.class在<bin>/testpackage包中
        // 1.properties  在bin目录(class根目录)
        System.out.println(TestMain.class.getResource("/1.properties"));
    }
}

※Class.getResource和Class.getResourceAsStream在使用时,路径选择上是一样的。

Class.getClassLoader().getResource(String path)

path不能以’/‘开头时;
path是从ClassPath根下获取;

还是先看一下下面这段代码的输出:

package testpackage;

public class TestMain {
    public static void main(String[] args) {
        TestMain t = new TestMain();
        System.out.println(t.getClass());
        System.out.println(t.getClass().getClassLoader());
        System.out.println(t.getClass().getClassLoader().getResource(""));
        System.out.println(t.getClass().getClassLoader().getResource("/"));//null
    }
}

输出结果:

class testpackage.TestMain
[email protected]
file:/E:/workspace/Test/bin/
null

从结果来看【TestMain.class.getResource("/") == t.getClass().getClassLoader().getResource("")】

如果有同样的Project结构

使用Class.getClassLoader().getResource(String path)可以这么写:

package testpackage;


public class TestMain {
    public static void main(String[] args) {
        TestMain t = new TestMain();
        System.out.println(t.getClass().getClassLoader().getResource(""));

        System.out.println(t.getClass().getClassLoader().getResource("1.properties"));
        System.out.println(t.getClass().getClassLoader().getResource("testpackage/2.properties"));
        System.out.println(t.getClass().getClassLoader().getResource("testpackage/subpackage/3.properties"));
    }
}

※Class.getClassLoader().getResource和Class.getClassLoader().getResourceAsStream在使用时,路径选择上也是一样的。

时间: 2024-10-08 10:19:15

关于Class.getResource和ClassLoader.getResource的路径问题的相关文章

[Java开发之路](18)关于Class.getResource和ClassLoader.getResource的路径问题

Java中取资源时,经常用到Class.getResource和ClassLoader.getResource.昨天老师讲解题目时候,问我们为什么你们都是在文件前家上"/": String path = Resources.class.getResource("/a.txt").getPath(); 注:在Resources文件下创建了a.txt文件 我想我反正是试出来的,不使用"/"不行.为了正式解答心中的疑惑,我们正式来看看Resources

Class.getResource和ClassLoader.getResource的路径写法

Java中取资源时,经常用到Class.getResource和ClassLoader.getResource,这里来看看他们在取资源文件时候的路径问题. Class.getResource(String path) path 不以’/'开头时,默认是从此类所在的包下取资源:以’/'开头时,则是从ClassPath根下获取: 同样用法的还有Class.getResource和Class.getResourceAsStream. Class.getClassLoader().getResource

Class.getResource和ClassLoader.getResource的区别分析

Class.getResource(String path)path不以'/'开头时,默认是从此类所在的包下取资源:path以'/'开头时,则是从项目的ClassPath根下获取资源.在这里'/'表示ClassPathJDK设置这样的规则,是很好理解的,path不以'/'开头时,我们就能获取与当前类所在的路径相同的资源文件,而以'/'开头时可以获取ClassPath根下任意路径的资源.如下所示的例子: 1 2 3 4 5 6 7 8 public class Test { public stat

Java Class.getResource和ClassLoader.getResource的使用

Java中获取资源文件的时候,经常会用到Class.getResource和ClassLoader.getResource,本文给大家说一下这两者方法在获取资源文件时的路径差异. Class.getResource(String path) path不以'/'开头时,默认是从此类所在的包下取资源: path以'/'开头时,则是从项目的ClassPath根下获取资源.在这里'/'表示ClassPath JDK设置这样的规则,是很好理解的,path不以'/'开头时,我们就能获取与当前类所在的路径相同

class.getResource与classloader.getResource

前言 之前偶然看到一篇别人写的文章 https://www.cnblogs.com/drwong/p/5389631.html .对于怎么找到classpath下的资源,比如图片呀,视频呀什么的..勾起了我的一点好奇心. 现在大家项目一般都是springboot的.那加载资源还是比较简单的..比如ClassPathResource呀..PathMatchingResourcePatternResolver呀(没有仔细确认,但是我印象中mybatis整合spring-boot的时候是用这个类去加载

myBatis中的注解@Param、返回值为Map、JAVA读取Excel并解析文本、Class.getResource()和ClassLoader.getResource()

myBatis中的注解@Param:http://blog.csdn.net/gao36951/article/details/44258217:  http://www.cnblogs.com/thomas12112406/p/6217211.html. myBatis返回值为Map:http://blog.csdn.net/werewr342352321df/article/details/11892755. ====================== JAVA读取Excel并解析文本:h

Class.getResource和ClassLoader.getResource区别与分析

零. 前言 在一个获取文件路径的代码内容上发现单元测试出现NullPointer, 但是这段代码却在服务器正常运行了两年多, 借此机会想认真探索下这两个方法的区别. 一. 区别 区别从代码输出结果来看比较清晰, 文件结构图: 以下为在多个场景下使用方式的代码: package com.wenniuwuren.test; /** * 获取文件路径 * Created by wenniuwuren on 15/8/14. */ public class GetResourceTest { publi

关于Class.getResource和ClassLoader.getResource的路径问题(转)

参考博客:http://www.cnblogs.com/yejg1212/p/3270152.html Class.getResource(String path) 当path以/开头,如/a/b/c.properties时,查找的路径为: classpath路径:path. 当path不以/开头时,如c.properties,查找的路径为:当前调用类的路径:path. 什么意思呢?看下面这段代码的输出结果就明白了: package testpackage; public class TestM

Class和ClassLoader.getResource获取资源

资源就是系统内.项目内的各种文件.在Java中获取可以用File类和Class.getResource获取资源,直观的说,File是依赖于文件系统和操作系统的,通过相对和绝对路径定位,使用File接口可以用于获取系统内任何路径下的普通文件.Class和ClassLoader可以用于获取项目环境中的资源,'环境中'的具体定义就是classpath.classpath相当于getResource参数的跟目录,ClassLoader.getResource是只能从这个根目录开始定位资源,Class.g