一、class.getResourceAsStream()java
从源码中能够看出他也是调用ClassLoader的getResourceAsStream()this
public InputStream getResourceAsStream(String name) { //对资源名进行解析 name = resolveName(name); ClassLoader cl = getClassLoader0(); if (cl==null) { // A system class. return ClassLoader.getSystemResourceAsStream(name); } return cl.getResourceAsStream(name); } private String resolveName(String name) { if (name == null) { return name; } if (!name.startsWith("/")) { Class<?> c = this; while (c.isArray()) { c = c.getComponentType(); } //获取class的全限定名,而后与name进行拼接 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()也就明白了。url
二、ClassLoader.getResourceAsStream()spa
也从源码能够看出,他是才用委托的方式进行资源的加在,若是委托的方式没加载到相应的资源。那就经过他本身进行处理了blog
public InputStream getResourceAsStream(String name) {资源
URL url = getResource(name); try { return url != null ? url.openStream() : null; } catch (IOException e) { return null; } } public URL getResource(String name) { URL url;
//经过父加载器进行资源加在 if (parent != null) {
url = parent.getResource(name); } else { url = getBootstrapResource(name); }
//父加载器加在资源失败,则经过自身进行查找 if (url == null) { url = findResource(name); } return url; }
总结:get
Class.getResourceAsStream() 能够指定相对路径,也能够指定绝对路径源码
ClassLoader.getResourceAsStream()先经过父加载器进行加载,若是没加载到就看具体的findResource()的实现了。固然对于通常程序而言,都是从类路径下进行查找。由于咱们本身的class都是经过AppClassLoader进行加载的string