一、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