class、classLoader的getResourceAsStream的區別

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

相關文章
相關標籤/搜索