在jar包里获得流形式的资源有两种方法,一个是Class.getResourceAsStream(String),另一个是ClassLoader.getResourceAsStream(String)。
实际上前一个只是引用了后一个的方法。不过其中加了一些判断。
而就是这些判断导致了两者之间的差异。参见代码。
由此可见,如果使用Class.getResourceAsStream(String)方法,则资源名要么设置为[color=blue][b]类所在包的相对名[/b][/color],要么设置为[color=blue][b]全路径名[/b][/color],而如果使用ClassLoader的相应方法,则要设置为[color=blue][b]不带根的全路径名[/b][/color]。
实际上前一个只是引用了后一个的方法。不过其中加了一些判断。
而就是这些判断导致了两者之间的差异。参见代码。
// 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]。