class.getResourceAsStream()与ClassLoader.getResourceAsStream()的区别

本文介绍了在Java中通过Class和ClassLoader两种方式从jar包获取资源流的区别。Class.getResourceAsStream需要资源名是类所在的包相对名或全路径名;而ClassLoader.getResourceAsStream则需不带根的全路径名。
摘要由CSDN通过智能技术生成
在jar包里获得流形式的资源有两种方法,一个是Class.getResourceAsStream(String),另一个是ClassLoader.getResourceAsStream(String)。
实际上前一个只是引用了后一个的方法。不过其中加了一些判断。
而就是这些判断导致了两者之间的差异。参见代码。

// java.lang.Class
public InputStream getResourceAsStream(String name) {
name = resolveName(name);
ClassLoader cl = getClassLoader0();
if (cl==null) { // 如果找不到ClassLoader,就寻找系统资源
// A system class.
return ClassLoader.getSystemResourceAsStream(name);
}
return cl.getResourceAsStream(name); // 否则就调用ClassLoader对应方法
}
//...
/**
* Add a package name prefix if the name is not absolute Remove leading "/"
* if name is absolute
*/
private String resolveName(String name) {
if (name == null) {
return name;
}
if (!name.startsWith("/")) {
Class c = this;
while (c.isArray()) {
c = c.getComponentType();
}
String baseName = c.getName();
int index = baseName.lastIndexOf('.');
if (index != -1) {
name = baseName.substring(0, index).replace('.', '/')
+"/"+name;
}
} else {
name = name.substring(1);
}
return name;
}

由此可见,如果使用Class.getResourceAsStream(String)方法,则资源名要么设置为[color=blue][b]类所在包的相对名[/b][/color],要么设置为[color=blue][b]全路径名[/b][/color],而如果使用ClassLoader的相应方法,则要设置为[color=blue][b]不带根的全路径名[/b][/color]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值