Java获取路径时Class.getResource()和ClassLoader.getResource()区别

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

环境信息:

系统:windows 10;
Java版本:jdk8;
开发工具:idea 2017.3.2;

涉及方法:

Class.getResource();
ClassLoader.getResource();
Class.getResourceAsStream();
ClassLoader().getResourceAsStream();

工程结构:

Java获取路径时Class.getResource()和ClassLoader.getResource()区别_第1张图片

测试代码:

package lc.util;

public class ResourceDemo {
    public static void main(String[] args) {
        ResourceDemo resourceDemo = new ResourceDemo();
        //Class.getResource路径
        System.out.println("1.ResourceDemo.class.getResource(\"\")路径:"+ResourceDemo.class.getResource("").getPath());
        System.out.println("2.ResourceDemo.class.getResource(\"/\")路径:"+ResourceDemo.class.getResource("/").getPath());
        System.out.println("3.ResourceDemo.class.getResource(\"/\")路径:"+resourceDemo.getClass().getResource("/").getPath());

        //ClassLoader().getResource路径
        System.out.println("4.ResourceDemo.class.getClassLoader().getResource()路径:"+ResourceDemo.class.getClassLoader().getResource("").getPath());
        System.out.println("5.ResourceDemo.class.getClassLoader().getResource(\"/\")路径:"+ResourceDemo.class.getClassLoader().getResource("/").getPath());

        //从不同位置取文件
        //1.从当前文件的子目录找文件,如果文件不存在调用getFile()方法会报空指针异常
        System.out.println(ResourceDemo.class.getResource("resdemo/res1.properties").getFile().toString());
        System.out.println(resourceDemo.getClass().getResource("resdemo/res1.properties").getFile().toString());
        //2.从当前文件同级目录找文件,如果文件不存在调用getFile()方法会报空指针异常
        System.out.println(ResourceDemo.class.getResource("res2.properties").getFile().toString());
        //3.从classpath根目录找文件,如果文件不存在调用getFile()方法会报空指针异常
        System.out.println(ResourceDemo.class.getResource("/res3.properties").getFile().toString());
        System.out.println(ResourceDemo.class.getClassLoader().getResource("res4.properties").getFile().toString());
    }
}

打印结果:

1.ResourceDemo.class.getResource("")路径:/E:/Workspace/iarp/target/classes/lc/util/
2.ResourceDemo.class.getResource("/")路径:/E:/Workspace/iarp/target/classes/
3.ResourceDemo.class.getResource("/")路径:/E:/Workspace/iarp/target/classes/
4.ResourceDemo.class.getClassLoader().getResource()路径:/E:/Workspace/iarp/target/classes/
5.ResourceDemo.class.getClassLoader().getResource("/")路径:null
/E:/Workspace/iarp/target/classes/lc/util/resdemo/res1.properties
/E:/Workspace/iarp/target/classes/lc/util/resdemo/res1.properties
/E:/Workspace/iarp/target/classes/lc/util/res2.properties
/E:/Workspace/iarp/target/classes/res3.properties
/E:/Workspace/iarp/target/classes/res4.properties

问题总结:

从结果显示来看,

1.Class.getResource(“”),即不以”/”开头的路径,是从当前Class类所在的包下取路径;
2.Class.getResource(“/”),即以”/”开头的路径,是从ClassPath根目录下取路径;
3.ClassLoader.getResource(),即不以”/”开头的路径,是从ClassPath根目录下取路径;
4.ClassLoader.getResource(“/”),即以”/”开头的路径,结果为null;
5.Class.getResourceAsStream()和Class.getResource相同;
6.ClassLoader().getResourceAsStream()和ClassLoader.getResource()相同;

相关说明:

这里测试工具为idea,Classpath路径为target目录;如果开发工具为eclipse,Classpath路径为bin目录。

你可能感兴趣的:(java积累,java,开发语言)