zoukankan      html  css  js  c++  java
  • class /classloader getResourceAsStream()与FileInputStream

    https://cloud.tencent.com/developer/ask/28683

    getResourceAsStream()通过classname的类加载器加载文件。如果类来自JAR文件,那么就会从JAR文件中加载资源。

    FileInputStream用于从文件系统读取文件。

    https://blog.csdn.net/buster2014/article/details/53787224

    props.load(new FileInputStream("db.properties")); 是读取当前目录的db.properties文件

    getClass.getResourceAsStream("db.properties"); 是读取当前类所在位置一起的db.properties文件

    getClass.getResourceAsStream("/db.properties"); 是读取ClassPath的根的db.properties文件,注意ClassPath如果是多个路径或者jar文件的,只要在任意一个路径目录下或者jar文件里的根下都可以,如果存在于多个路径下的话,按照ClassPath中的先后顺序,使用先找到的,其余忽略.

     

    彻底搞懂Class.getResource和ClassLoader.getResource的区别和底层原理

    Class.getResource和ClassLoader.getResource 最终调用的是ClassLoader 类的getResource方法。只不过Class.getResource是先调用Class 的 getResource 方法,在这个getResource  方法中,再去调用ClassLoader 类的getResource方法

    那么Class类中的getResource方法做了什么呢,主要的一句是 name = resolveName(name); 
    ---------------------
    作者:张守康
    来源:CSDN
    原文:https://blog.csdn.net/zhangshk_/article/details/82704010
    版权声明:本文为博主原创文章,转载请附上博文链接!

    设class包完整名为a.b.c
    class.getResource  获取当前类加载器及其父加载器下a.b.c/下的资源
    classloader.getResource  获取当前类加载器及其父加载器下所有jar包内资源(取第一个)
     
     (而且会优先级为 父加载器——不一定本jar包(即执行代码的所在jar包)的子加载器所有jar包随机
     
    class.getResource(“/“) = classloader.getResource(“”)
     
    所以从包名限定的角度说,前者比后者保险,假设2个jar包resource下都有资源文件a,则运行期具体拿哪个未知,但如果a有个性的包名,则冲突的可能性就大大降低
     
            System.out.println(FingerPrint.class.getResource(""));
            System.out.println(FingerPrint.class.getClassLoader().getResource(""));
            System.out.println(FingerPrint.class.getResource("/"));
            System.out.println(FingerPrint.class.getClassLoader().getResource("/"));
    
            System.out.println(FingerPrint.class.getResource(""));
            System.out.println(FingerPrint.class.getClassLoader().getResource("expire.png"));
            System.out.println(FingerPrint.class.getResource("/expire.png"));
            System.out.println(FingerPrint.class.getClassLoader().getResource("/"));
    

    jar:file:/Users/sunyuming/.m2/repository/com/jds/fast/fid-common/1.0.2/fid-common-1.0.2.jar!/com/jds/fid/fid_common/
    file:/Users/sunyuming/work/MyTest/target/classes/  证明有可能先从本jar包读,从而忽略FingerPrint所在jar包中的资源
    file:/Users/sunyuming/work/MyTest/target/classes/
    null
    jar:file:/Users/sunyuming/.m2/repository/com/jds/fast/fid-common/1.0.2/fid-common-1.0.2.jar!/com/jds/fid/fid_common/
    jar:file:/Users/sunyuming/.m2/repository/com/jds/fast/fid-common/1.0.2/fid-common-1.0.2.jar!/expire.png
    jar:file:/Users/sunyuming/.m2/repository/com/jds/fast/fid-common/1.0.2/fid-common-1.0.2.jar!/expire.png
    null

    可以看到,classloader的getResource可能先在本jar包(即执行代码的所在jar包)内寻找,所以如果本jar包resource下也有一个expire.png,就会找错

    具体来说,是从本jar包先,还是其它情况,请看:classloader getresource jar包资源冲突情况,父亲为大,兄弟之间,谁先加载谁牛逼

    2020.1.7

    并不是class.getresource所有场景都有用的,当src下放着你的resource,而不是resource目录下,你就要注意了

    使用resource中的jar包资源作为UrlClassloader

  • 相关阅读:
    UML基础—结构和组成
    Hadoop完全分布式
    Hadoop完全分布式
    查看端口是否启用
    查看端口是否启用
    hadoop namenode启动失败
    hadoop namenode启动失败
    Hadoop2.7.5伪分布式安装
    Hadoop2.7.5伪分布式安装
    给用户添加sudo权限
  • 原文地址:https://www.cnblogs.com/silyvin/p/10523050.html
Copyright © 2011-2022 走看看