zoukankan      html  css  js  c++  java
  • 有关getClassLoader().getResourceAsStream(fileName)、class.getResourceAsStream(fileName)和().getContextClassLoader().getResourceAsStream(fileName)的区别

        一:前言

        在自己获取属性时,碰见了XX.class.getResourceAsStream(fileName),自己对这个其实不是很理解,上网查了下资料,又看到了上述的几个,所以就研究了下。

    二:内容

      先说说着几个区别吧

      getClassLoader().getResourceAsStream("a.txt"):此方法的路径不管是绝对路径还是想对路径,都是从path下找得,即使"./a.txt"的形式去寻找,在此处我们要注意空指向异常的情况(可以看看这里写的http://cache.baiducontent.com/cm=9d78d513d99c12eb0fb1837e7c4380200e55f0326284915468d5e316ce370d160771e2cb30536713a0b66b6671f30e02b4e47132690c7af1dd8a9f4baea68f7871d57223706bdd124d9b58e5dc46529e778d1bb3f25cf0ba8768d5f18cc4de20089c44040c84f3895803&p=9274c54ad5c246e74bbe9b7c4605bb&newp=867cc54ad5c246bc4bbe9b7c4f0a9f231610db2151d6d11f6cc7&user=baidu&fm=sc&query=maven+getClassLoader%CE%AAnull&qid=bf473e2d0001b6a7&p1=3)。其中写到了Bootstrap ClassLoader (启动类加载器或者叫引导类加载器)加载jdk核心的APIs,这些APIs一般位于jdk_home/lib下;它是一个本地接口,所以不能从java代码中得到它的信息。例如, log(java.lang.String.class.getClassLoader())得到的是null(引用自http://blog.csdn.net/benjieming_wang/article/details/5623492)。classLoader是一种类加载器.

    现在我就来附上代码说明吧:

    package org.wh.properties;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Iterator;
    import java.util.Properties;
    import java.util.Set;
    
    public class PropertiesDemo01 {
        Properties prop;
        public void setProp(Properties prop) {
            this.prop = prop;
        }
        public static void main(String args[]){
            loadConfig();
        }
        public static  Properties loadConfig(){
            Properties prop = new Properties();
            //Class的getResource()方法是从当前.class文件路径查找资源,而ClassLoader则是从jar包中查找
            //InputStream input = Properties.class.getResourceAsStream("/jdbcUtils.properties");
            InputStream input1 = PropertiesDemo01.class.getClassLoader().getResourceAsStream("jdbcUtils.properties");
            System.out.println("jdk的类加载器"+Properties.class.getClassLoader());//结果:jdk的类加载器:null
            System.out.println("demo:"+PropertiesDemo01.class.getClassLoader());//结果:demo:sun.misc.Launcher$AppClassLoader@addbf1
            try {
                prop.load(input1);
                @SuppressWarnings("rawtypes")
                Set keyValue=prop.keySet();
                for(Iterator a=keyValue.iterator();a.hasNext();){
                    String key=(String) a.next();
                    String value=prop.getProperty(key);
                    System.out.println("-key的值--"+key+"value--的值-"+value);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return prop;
        }
    }
    结论:如果在这里用jdk的内部类就会报空指向异常,我们可以看到Properties.class.getClassLoader()得到的结果是null;

    class.getResourceAsStream(fileName):fileName中加了“/”则代表了绝对路径,否则就是相对路径。代码可见上述
    再说说Thread.currentThread().getContextClassLoader():这个是当前线程的类加载器,

    package org.wh.properties;
    
    public class Test {
    
        public static void main(String[] args) {
            
            System.out.println(Thread.currentThread().getContextClassLoader());//当前线程的类加载器
            System.out.println(Test.class.getClassLoader());//当前类的类加载器
            System.out.println(ClassLoader.getSystemClassLoader());//系统初始的类加载器
        }
    
    }

    参考资料可以看看这里:http://stackoverflow.com/questions/676250/different-ways-of-loading-a-file-as-an-inputstream
      


  • 相关阅读:
    JsBridge踩坑之WebViewJavascriptBridge is undefined,找不到Bridge对象
    Android踩坑之couldn't find "libClingSDK.so"
    GDM, KDM, LightDM, SDDM的区别和安装配置
    安装完ubuntu需要做得事
    apt vs snap
    在shell下执行命令的方法
    Vimmer一套全语言支持的完美Vim配置——附Monaco字体
    Ubuntu gnome安装Monaco字体,FontForge module is probably not installed
    Ubuntu全方位美化,定制教程
    stm32--FatFs调试过程(SPIFlash)
  • 原文地址:https://www.cnblogs.com/wuhao1991/p/4071909.html
Copyright © 2011-2022 走看看