首页 > 编程语言 >java getResource() 方法执行规律展示

java getResource() 方法执行规律展示

时间:2023-01-11 15:56:07浏览次数:42  
标签:java 展示 getResource jar HangTianDongLiUtil System println class

结论

  1. getClassLoader().getResource(String s) 读取的是当前项目的根目录; getResource(String s) 读取的时 class类存在的目录
  2. getClassLoader().getResource(String s) 调用时, 传递参数开头不能包含斜杠(/), 否则读不到文件; getResource(String s) 调用时, 参数开头包含斜杠(/), 则从根目录开始读取(即: getResource("/") == getClassLoader().getResource("")), 不包含斜杠时, 读取类存在的目录
  3. 从根目录开始读文件时, 如果文件不存在, 则会去jar包中寻找文件, 再如果jar包中也不存在, 则返回null; 从class类存在的目录读取文件时, 如果不存在则直接返回null

结论性展示, 非展示原理

测试代码

/* 调用 getClassLoader() */
        // 读取当前项目的根目录
        System.out.println(HangTianDongLiUtil.class.getClassLoader().getResource(""));
        // 优先读取根目录下的文件; 如果文件不存在, 则会去jar包查找文件(!!!开头不能带/)
        System.out.println(HangTianDongLiUtil.class.getClassLoader().getResource("META-INF/NOTICE.txt"));
        // 带斜杠读取不到内容
        System.out.println(HangTianDongLiUtil.class.getClassLoader().getResource("/"));
        System.out.println(HangTianDongLiUtil.class.getClassLoader().getResource("/HangTianDongLiUtil.class"));
        System.out.println(HangTianDongLiUtil.class.getClassLoader().getResource("/META-INF/NOTICE.txt"));
        // 以流读取的规则也与上面的一致
        System.out.println(HangTianDongLiUtil.class.getClassLoader().getResourceAsStream("META-INF/NOTICE.txt"));
        System.out.println(HangTianDongLiUtil.class.getClassLoader().getResourceAsStream("/META-INF/NOTICE.txt"));
        System.out.println();
        /* 直接调用 getResource() */
        // 传入空字符串时, 返回的时传入的class的位置
        System.out.println(HangTianDongLiUtil.class.getResource(""));
        // 传入 / 时, 读取当前项目的根目录, 等同于 ==> getClassLoader().getResource()
        System.out.println(HangTianDongLiUtil.class.getResource("/"));

        // 读取根目录下的文件, 读不到会读 jar 包中的文件; 如果jar包中也找不到对应文件, 则返回null;
        System.out.println(HangTianDongLiUtil.class.getResource("/META-INF/NOTICE.txt"));
        System.out.println(HangTianDongLiUtil.class.getResource("/HangTianDongLiUtil.class"));
        // 查找class类下的文件, 找不到直接返回null, 不会去读取jar包
        System.out.println(HangTianDongLiUtil.class.getResource("META-INF/NOTICE.txt"));
        System.out.println(HangTianDongLiUtil.class.getResource("HangTianDongLiUtil.class"));
  1. 调用 getClassLoader().getResource()

    System.out.println(HangTianDongLiUtil.class.getClassLoader().getResource(""));
    

    执行结果: file:/E:/project/learning/myLogProject/build/classes/java/main/

    解释: 传入参数为空字符串时(""), 返回当前项目的根目录

    System.out.println(HangTianDongLiUtil.class.getClassLoader().getResource("META-INF/NOTICE.txt"));
    

    执行结果: jar:file:/D:/xx/local_jar/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-devtools/3.0.0/efb77f02a6312690c69049ad2bee06cab7a21a0f/spring-boot-devtools-3.0.0.jar!/META-INF/NOTICE.txt

    解释: 传入参数为不带'/'的字符串时, 从根目录查找文件; 如果找不到, 则会从jar包中查找

以下为测试代码的全部测试结果 ↓

file:/E:/project/learning/myLogProject/build/classes/java/main/
jar:file:/D:/zq/local_jar/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-devtools/3.0.0/efb77f02a6312690c69049ad2bee06cab7a21a0f/spring-boot-devtools-3.0.0.jar!/META-INF/NOTICE.txt
null
null
null
sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream@4c163e3
null

file:/E:/project/learning/myLogProject/build/classes/java/main/com/myproject/mylogproject/main/
file:/E:/project/learning/myLogProject/build/classes/java/main/
jar:file:/D:/zq/local_jar/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-devtools/3.0.0/efb77f02a6312690c69049ad2bee06cab7a21a0f/spring-boot-devtools-3.0.0.jar!/META-INF/NOTICE.txt
null
null
file:/E:/project/learning/myLogProject/build/classes/java/main/com/myproject/mylogproject/main/HangTianDongLiUtil.class

标签:java,展示,getResource,jar,HangTianDongLiUtil,System,println,class
From: https://www.cnblogs.com/qianchangseven/p/17043975.html

相关文章

  • Java 解析 带 T Z 的 UTC 时间格式 日期
    直接上代码吧publicstaticvoidmain(String[]args)throwsParseException{SimpleDateFormatdf=newSimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")......
  • Failed to parse multipart servlet request; nested exception is java.lang.Runtime
    这个是本地测试导入Excel的时候报的错NoSuchFileException找不到文件异常,看后边文件名大概知道这个就是临时文件生成失败,导致springcloud项目找不到文件 解决方案:在......
  • Java上的try catch并不影响性能
     先说结论,未有异常发生时,二者性能上几乎没有差别。trycatch关键字在编译器级别上的实现原理:1、类会跟随一张异常表(exceptiontable),每一个trycatch都会在这个表里......
  • Java面试题Day08
    1.强引用,软引用,弱引用,虚引用的区别?强引用:我们平时new了一个对象就是强引用,例如Objectobj=newObject();即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误......
  • JavaScript超大文件上传
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。这次项目的需求:支持大文件的上传和续传,要求续传支持......
  • Redux与前端表格施展“组合拳”,实现大屏展示应用的交互增强
    Redux是JavaScript状态容器,提供可预测化的状态管理。它可以用在react、angular、vue等项目中,但与react配合使用更加方便一些。Redux原理图如下,可以看到store仓库......
  • Jmeter 加载Java代码并执行
    BeanShell中引用外部类,有三种方法:1)引用源文件,即.java文件。2)引用字节码文件,即.class文件。3)引用jar包,即.jar文件。方法1,引用源文件1)创建java文件publicclassTestA{......
  • Java8常见函数式接口总结
    函数式接口函数式接口:有且仅有一个抽象方法的接口。使用@FunctionalInterface注解来标记。如果接口不是函数式接口就会编译出错满足条件的接口即使不加上注解,那也是函......
  • Redux与前端表格施展“组合拳”,实现大屏展示应用的交互增强
    Redux是JavaScript状态容器,提供可预测化的状态管理。它可以用在react、angular、vue等项目中,但与react配合使用更加方便一些。Redux原理图如下,可以看到store仓......
  • JavaScript – Sort
    前言写程序难免会遇到需要排序的时候.但看是简单的排序,其实暗藏杀机.一不小心就会搞出Bug哦.这篇就简单聊聊JS的排序 ><大过小过排序自然就是先比大小咯.......