Java学习之getResource方法获取项目下文件路径

Java学习之getResource方法获取项目下文件路径

  • 概念介绍
  • 常用方法
  • 案例代码
  • 总结
  • 参考链接

概念介绍

  • 匹配规则

    项目经常会读取一些配置文件,因此getResource方法便能够起到重要作用。

    JDK设置这样的规则,path不以’/‘开头时,能获取与当前类所在的路径相同的资源文件,而以’/'开头时可以获取ClassPath根路径下的任意资源

常用方法

主要是两种方法,一个是字节码文件Class类,另一个是ClassLoader类加载器。通过ClassLoader来加载getResource()时不需要加 "/" 因为source是从main开始的;通过Class.getResource()来加载文件时需要加"/"

   Thread.currentThread().getContextClassLoader().getResource("main/test/test.txt").getPath();

  • 使用Class类时有两种使用方式

    1. 使用"/",获取到的是classpath路径

    2. 不使用"/",这就是相对路径

  • ClassLoader类

    1. 不使用"/",获取到的就是classpath路径

案例代码

  • 项目结构

    Java学习之getResource方法获取项目下文件路径_第1张图片

  • 测试代码

    
    
      public static void main(String[] args) {
           
    
          // 输出DateUtil类编译后所在路径:/D:/Develop/adtecWorkspace/springboot-easyexcel-demo-master/target/classes/link/lycreate/springbooteasyexceldemo/utils/
          System.out.println(DateUtil.class.getResource("").getPath());
    
          // /D:/Develop/adtecWorkspace/springboot-easyexcel-demo-master/target/classes/link/lycreate/springbooteasyexceldemo/utils/
          System.out.println(DateUtil.class.getResource(".").getPath());
    
          // 输出classpath的根目录:/D:/Develop/adtecWorkspace/springboot-easyexcel-demo-master/target/classes/
          System.out.println(DateUtil.class.getResource("/").getPath());
    
          // 输出DateUtil.class所在路径包括编译类名:/D:/Develop/adtecWorkspace/springboot-easyexcel-demo-master/target/classes/link/lycreate/springbooteasyexceldemo/utils/DateUtil.class
          System.out.println(DateUtil.class.getResource("DateUtil.class").getPath());
    
          // 输出根路径下不存在的DateUtil.class所在路径:null
          System.out.println(DateUtil.class.getResource("/DateUtil.class"));
    
          // 输出根路径下存在的application.yml所在路径:file:/D:/Develop/adtecWorkspace/springboot-easyexcel-demo-master/target/classes/application.yml
          System.out.println(DateUtil.class.getResource("/application.yml"));
    
          // 类加载器获取方式:null
          System.out.println("类加载器获取方式:" + DateUtil.class.getClassLoader().getResource("/application.yml"));
    
          // 类加载器获取方式:file:/D:/Develop/adtecWorkspace/springboot-easyexcel-demo-master/target/classes/application.yml
          System.out.println(DateUtil.class.getClassLoader().getResource("application.yml"));
    
    
    
    
      }
    
    

总结

  1. Class.getResource真正调用ClassLoader.getResource方法之前,会先获取文件的路径(path不以’/‘开头时,默认是从此类所在的包下取资源;path以’/'开头时,则是从项目的ClassPath根下获取资源)。

  2. ClassLoader.getResource方法会通过双亲委派机制,先委派双亲去加载类,如果双亲没有加载到,则再由自己加载。

参考链接

  • 关于java的getResource方法

    https://blog.csdn.net/crazyboy12138/article/details/80717271

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

    https://blog.csdn.net/zhangshk_/article/details/82704010

你可能感兴趣的:(Source,Code,java)