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();
工程结构:
测试代码:
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目录。