首页 > 其他分享 >spring boot ResourceUtil工具类获取不到jar的classPath下面文件问题

spring boot ResourceUtil工具类获取不到jar的classPath下面文件问题

时间:2023-06-10 10:22:48浏览次数:50  
标签:文件 读取 spring boot jar classPath content file import

先说结论

  1. 这种方式是获取不到jar里面的文件的,但是在本地可以跑,打成jar包就读取不到文件了,即便 ResourceUtils 是spring提供的。
File file = ResourceUtils.getFile("classpath:temp\\file\\info.txt");
  1. spring提供的ClassPathResource对象是可以在本地和jar环境都获取到资源的
ClassPathResource classPathResource = new ClassPathResource("temp\\file\\info.txt");
InputStream inputStream=classPathResource.getInputStream();
  1. 另外java原生的方式也可以一获取到jar里面的文件
InputStream inputStream = getClass().getResourceAsStream("/temp/file/info.txt");

需要注意的是,getClass().getResourceAsStream 默认是取当前包名下面的资源,如果是/开头是取classpath下面的资源

测试代码如下:

package com.lomi.controller;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.lomi.annotation.ShowParam;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.*;

@Api(tags = "文件读取")
@RestController
@RequestMapping(value = "/file")
@Slf4j
public class FileController extends BaseController {


    /**
     * 本地运行,m1不能获取到文件,m1_1,m2,m3可以
     * jar包以后运行:m1,m3不能获取到文件,m1_1,m2可以
     * M1_2 是相对路径放在指定的路径下也可以jar和运行时都读取到
     *
     * @return
     * @throws IOException
     */


    @ApiOperation(value = "读取本地classpath下面的文件方式1")
    @GetMapping("/readFile/m1")
    @ShowParam
    public String readFileM1() throws IOException {
        //方法1,不读取jar里面的文件
        InputStream inputStream = getClass().getResourceAsStream("temp\\file\\info.txt");

        String content = IoUtil.readUtf8(inputStream);
        log.debug("内容是:{}", content);
        return content;
    }


    /**
     * getClass().getResourceAsStream 默认是取当前包名下面的资源,如果是/开头是取classpath下面的资源
     *
     * @return
     * @throws IOException
     */
    @ApiOperation(value = "读取本地classpath下面的文件方式1_1")
    @GetMapping("/readFile/m1_1")
    @ShowParam
    public String readFileM1_1() throws IOException {
        //方法1,不读取jar里面的文件
        InputStream inputStream = getClass().getResourceAsStream("/temp/file/info.txt");

        String content = IoUtil.readUtf8(inputStream);
        log.debug("内容是:{}", content);
        return content;
    }



    /**
     * getClass().getResourceAsStream 默认是取当前包名下面的资源(com.lomi.controller),如果是/开头是取classpath下面的资源
     *
     * @return
     * @throws IOException
     */
    @ApiOperation(value = "读取本地classpath下面的文件方式1_2")
    @GetMapping("/readFile/m1_2")
    @ShowParam
    public String readFileM1_2() throws IOException {
        //方法1,不读取jar里面的文件
        InputStream inputStream = getClass().getResourceAsStream("info.txt");

        String content = IoUtil.readUtf8(inputStream);
        log.debug("内容是:{}", content);
        return content;
    }



    @ApiOperation(value = "读取本地classpath下面的文件方式2")
    @GetMapping("/readFile/m2")
    @ShowParam
    public String readFileM2() throws IOException {
        //方法2,可以读取打成jar包里面的文件
        ClassPathResource classPathResource = new ClassPathResource("temp\\file\\info.txt");
        InputStream inputStream = classPathResource.getInputStream();


        String content = IoUtil.readUtf8(inputStream);
        log.debug("内容是:{}", content);
        return content;
    }

    @ApiOperation(value = "读取本地classpath下面的文件方式3")
    @GetMapping("/readFile/m3")
    @ShowParam
    public String readFileM3() throws IOException {
        //方法3,可以读取打成jar包里面的文件
        File file = ResourceUtils.getFile("classpath:temp\\file\\info.txt");

        String content = FileUtil.readUtf8String(file);
        log.debug("内容是:{}", content);
        return content;
    }


}

模板文件位置

image-20230606182235946

m1_2文件位置
image-20230608101519183

标签:文件,读取,spring,boot,jar,classPath,content,file,import
From: https://www.cnblogs.com/cxygg/p/17470846.html

相关文章

  • JAVA的springboot+vue家政服务管理平台,家政预约管理系统,附源码+数据库+论文+PPT
    1、项目介绍随着家政服务行业的不断发展,家政服务在现实生活中的使用和普及,家政服务行业成为近年内出现的一个新行业,并且能够成为大众广为认可和接受的行为和选择。设计家政服务管理平台的目的就是借助计算机让复杂的销售操作变简单,变高效。家政服务管理平台采用了B/S结构,JAVA作......
  • SpringBoot+Mysql+IDEA开发的社区医疗综合服务平台
    基于springboot的社区养老医疗综合服务平台项目介绍......
  • dubbo+spring+zookeeper的集成入门实例
    一、启动zookeeper我用的kafka自带的zookeeper任务管理器输入bin\windows\zookeeper-server-start.batconfig\zookeeper.properties开启zookeeperCtrl+c输入Y关闭服务 二、安装dubbo—admin管理控制台1、打开https://github.com/apache/dubbo-admin/tree/......
  • SpringCloud中实现全局过滤器JWT校验
    思路图思路分析用户进入网关开始登陆,网关过滤器进行判断,如果是登录,则路由到后台管理微服务进行登录用户登录成功,后台管理微服务签发JWTTOKEN信息返回给用户用户再次进入网关开始访问,网关过滤器接收用户携带的TOKEN网关过滤器解析TOKEN,判断是否有权限,如果有,则放行,如果没有......
  • spring-boot-data Redis 使用
    spring-boot-dataredisSpringBoot提供了Redis集成启动器(Starter),依赖于spring-data-redis和lettuce库。spring-data-redis:对Reids底层开发包高度封装,让开发者对Redis的CRUD操作起来更加方便。创建工程导入相关依赖<dependency><groupId......
  • SpringMVC WebUploader 分片上传
    ​ 需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500G内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以500G来进行限制。PC端全平台支持,要求支持Windows,Mac,Linux支持所有浏览器。支持文件批量上传支持文件夹上传,且要求在服务端保留层......
  • JDK 动态代理 和 CGLIB 动态代理 的区别【SpringAOP】
    一、原理区别(版本一)Java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。1、如果目标对象实现了接口,默认......
  • 构建高可用、高效、安全和可靠的分布式系统:Spring Cloud为开发人员提供便利
    SpringCloud是一个基于Spring框架的云应用开发工具箱,可以快速构建分布式应用程序。它为开发人员提供了许多有用的功能,例如服务发现、负载均衡、配置管理和应用监控等,这些功能可以使分布式系统更加稳定和可靠。如果您还没有了解过SpringCloud,我强烈建议您观看以下这个视频链接:ht......
  • 简单记录下Spring boot 3.1的升级过程
    SpringBoot在2023年的5月18号发布了3.1版本,手里有些项目版本是2.X,借这个机会把项目升级到最新版本+更新JDK20在这里简单随便记录一下踩坑的地方,在文章的末尾放上了官方的migration向导,你可以根据此参考升级你的项目。 通过SpringInitializr获取最新的版本,拷贝至项目里。 ......
  • java(springboot)实现将一个pdf按页码转成多张图片
    以下是一个将PDF转换成JPG格式图片的SpringBoot接口代码:importorg.apache.pdfbox.pdmodel.PDDocument;importorg.apache.pdfbox.rendering.PDFRenderer;importorg.springframework.http.MediaType;importorg.springframework.scheduling.annotation.Async;import......