• SpringBoot读取静态资源文件


     ClassPathResource resource = new ClassPathResource(publicKeyCer);
    File file = null;
    try {
    file = resource.getFile();
    } catch (IOException e) {
    e.printStackTrace();
    }
    InputStream inStream = new FileInputStream( file.getPath());


    一、需求场景
    有时候我们需要在项目中使用一些静态资源文件,比如城市信息文件 countries.xml,在项目启动后读取其中的数据并初始化写进数据库中。

    二、实现
    静态资源文件 countries.xml 放在 src/main/resources 目录下

    使用 Spring 的 ClassPathResource 来实现 :

    Resource resource = new ClassPathResource("countries.xml");
    File file = resource.getFile();
    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
    1
    2
    3
    ClassPathResource 类的注释如下:

    Resource implementation for class path resources. Uses either a given ClassLoader or a given Class for loading resources.

    Supports resolution as java.io.File if the class path resource resides in the file system, but not for resources in a JAR. Always supports resolution as URL.
    1
    2
    3
    翻译过来就是:

    类路径资源的资源实现。使用给定的ClassLoader或给定的类来加载资源。

    如果类路径资源驻留在文件系统中,则支持解析为 java.io.File,如果是JAR中的资源则不支持。始终支持解析为URL。
    1
    2
    3
    三、Jar 中资源文件
    上面也提到了,如果静态资源文件在文件系统里,则支持解析为 java.io.File,程序是能正常工作的。

    到项目打包成 Jar 包放到服务器上运行就报找不到资源的错误了!

    解决法案是:不获取 java.io.File 对象,而是直接获取输入流:

    Resource resource = new ClassPathResource("countries.xml");
    BufferedReader br = new BufferedReader(new InputStreamReader(resource.getInputStream()));
    1
    2
    说明:构造得到 resource 对象之后直接获取其输入流 resource.getInputStream()。

    四、附录
    Spring Boot access static resources missing scr/main/resources
    Classpath resource not found when running as jar

  • 相关阅读:
    为什么需要Docker?
    shiro原理
    java面对对象
    mysql面试题
    spring boot +thymeleaf+ mybatis
    mysql语句级sql
    spring boot+spring cloud面试笔记
    Docker-compose配置
    Docker compose命令的使用
    Dockerfile操作命令说明
  • 原文地址:https://www.cnblogs.com/jabez1992/p/10059091.html
Copyright © 2020-2023  润新知