解读classpath读取resources目录下的文件

作者:人工智 时间:2023-01-25 05:49:36 

classpath读取resources目录下文件

最近在springboot+maven的项目中去读取资源文件的时候,报了找不到文件的错误。

由此展开了对maven项目编译前和编译后的目录结构的了解,以及对java的classpath的理解。

首先:

由Maven构建的web工程,java代码放在src/main/java路径下,资源(配置文件等)放在src/main/resources路径下,当构建jar包 或 war包时,JVM虚拟机会自动编译java文件为class文件存放在 target/classes目录下,resource资源下的文件会原封不动的拷贝一份到 target/classes 目录下:而我们一般取的classpath就是target/classes目录

解读classpath读取resources目录下的文件

你可以通过这种方式打印你的calsspath

A.class.getClassLoader().getResource("").getPath();

这里又引出一个话题,我们可以根据两种不同的方式去获取Resources下的文件

1、class.getResource()

import org.junit.jupiter.api.Test;

public class ResourceTestDemo {

@Test
   void getResourceTest(){
       System.out.println(ResourceTestDemo.class.getResource(""));
       System.out.println(ResourceTestDemo.class.getResource("/"));
      }

打印结果:

1、file:/Users/username/Documents/TestDev/MyTraining/XUnit/ResourceTest/target/classes/3.txt
2、file:/Users/username/Documents/TestDev/MyTraining/XUnit/ResourceTest/target/classes/test/2.txt

结果分析:

  • 1、getResource("")不带"/“时候是从当前类所在包路径去获取资源

  • 2、getResource("/")带”/"时候是从classpath的根路径获取

2、getClassLoader().getResource()

@Test
void getClassLoaderResourceTest(){
    System.out.println(ResourceTestDemo.class.getClassLoader().getResource(""));
    System.out.println(ResourceTestDemo.class.getClassLoader().getResource("/"));
}

打印结果:

file:/Users/qinzhen/Documents/TestDev/MyTraining/XUnit/ResourceTest/target/test-classes/
null

  • class.getResource()不带"/"时候是从当前类所在包路径去获取资源

  • class.getResource()带"/"时候是从classpath的根路径获取

  • class.getResource()本质上也是调用了getClassLoader,只是封装了一层方便了我们使用而已

  • getClassLoader().getResource("")不带"/"时候是从classpath的根路径获取

  • getClassLoader().getResource("/")路径中无法带有"/"

  • getResourceAsStream() 方法仅仅是获取对应路径文件的输入流,在路径的用法上与getResource()一qu

4、批量读取

如果想要批量读区resource下的文件呢?

Resource[] resources = ResourceTestDemo.class.getClassLoader().getResources("validator-config/*.xml");
for (int i = 0; i < resources.length; i++) {
   InputStream inputStream = resources[i].getInputStream();
   String xmlContent = IOUtils.toString(inputStream, "UTF-8");
   System.out.println("content" + i + "=" + xmlContent);
}

5、如果配置文件中要引用这个文件的路径呢?

用classpath:xxx.xml 就可以了(xxx.xml放在resources目录下)。注意是springboot的项目

如果还是取不到,看看你的maven工程的pom文件是否做了过滤文件,比如.keystore文件

<build>
   <resources>
       <resource>
           <directory>src/main/resources</directory>
           <filtering>true</filtering>
           <excludes>
               <exclude>*.keystore</exclude>
           </excludes>
       </resource>
       <resource>
           <directory>src/main/resources</directory>
           <filtering>false</filtering>
           <includes>
               <include>*.keystore</include>
           </includes>
       </resource>
   </resources>
</build>

来源:https://blog.csdn.net/qq_35789269/article/details/116766487

标签:classpath,resources,目录,文件
0
投稿

猜你喜欢

  • C#实现的简单随机数产生器功能示例

    2023-06-05 12:57:54
  • Java使用Lettuce客户端在Redis在主从复制模式下命令执行的操作

    2023-11-28 21:38:19
  • SpringBoot内置tomcat启动原理详解

    2021-11-02 19:32:33
  • Mybatis 中的sql批量修改方法实现

    2022-12-10 23:36:51
  • java 如何读取properties文件

    2023-08-28 05:23:01
  • dubbo如何实现consumer从多个group中调用指定group的provider

    2022-06-09 01:00:13
  • C#实现语音视频录制-附demo源码

    2023-10-04 13:22:03
  • Java 滑动窗口最大值的实现

    2021-09-10 15:34:20
  • Java String类常用方法梳理总结

    2021-08-22 17:57:03
  • Android开发AsmClassVisitorFactory使用详解

    2023-07-22 05:34:53
  • Android中使用GridView实现仿微信图片上传功能(附源代码)

    2023-11-27 02:01:25
  • ELK搭建线上日志收集系统

    2021-11-01 17:34:41
  • Java实现简单猜拳游戏

    2023-05-27 18:28:16
  • 深入浅出讲解Java集合之Map接口

    2023-10-14 20:52:46
  • Android WebView开发之自定义WebView工具框

    2023-01-12 13:41:43
  • Android编程之ProgressBar圆形进度条颜色设置方法

    2022-03-11 15:26:25
  • springboot应用访问zookeeper的流程

    2021-11-28 00:34:56
  • 详解Java内部类与对象的打印概念和流程

    2021-10-10 21:36:56
  • C#图像伪彩色处理方法

    2022-09-23 10:51:52
  • C# 对PDF文档加密、解密(基于Spire.Cloud.SDK for .NET)

    2021-11-23 05:37:26
  • asp之家 软件编程 m.aspxhome.com