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目录。
参考文章:关于Class.getResource和ClassLoader.getResource的路径问题;
最新评论
我的是ipv4网络,如何使用直播源啊!
我今天试了,不想啊,我的是新疆昌吉移动的网络。
收不到验证码电报
现在充值29起了