SpringBoot项目中读取resource目录下的文件六种方法

 更新时间:2024年05月08日 09:51:45   作者:zunf  
这篇文章给大家总结了SpringBoot项目中读取resource目录下的文件六种方法,文中有详细的代码示例供大家参考,具有一定的参考价值,需要的朋友可以参考下

一、先获取绝对路径再读取文件(jar包里会获取不到)

方法一:类加载器的getResource().getPath()获取目录路径

    /**
     * 方法一:使用类加载器的getResource().getPath()获取全路径再拼接文件名,最后根据文件路径获取文件流
     * 备注:jar包不可用,因为jar包中没有一个实际的路径存放文件
     *
     * @param fileName
     * @return
     * @throws FileNotFoundException
     */
    public BufferedReader function1(String fileName) throws FileNotFoundException {

        //   /Users/zunf/code/read-resource/target/classes/
        String path = this.getClass().getClassLoader().getResource("").getPath();
        //   /Users/zunf/code/read-resource/target/classes/测试.txt
        String filePath = path + fileName;

        return new BufferedReader(new FileReader(filePath));
    }

方法二:类加载器的getResource().getPath()获取文件路径

    /**
     * 方法二:使用类加载器的getResource().getPath(),传参直接获取文件路径,再根据文件路径获取文件流
     * 备注:jar包不可用,因为jar包中没有一个实际的路径存放文件
     *
     * @param fileName
     * @return
     * @throws IOException
     */
    public BufferedReader function2(String fileName) throws IOException {

        //   /Users/zunf/code/read-resource/target/classes/%e6%b5%8b%e8%af%95.txt
        String filePath = this.getClass().getClassLoader().getResource(fileName).getPath();

        //可以看到上面读取到路径的中文被URLEncoder编码了,所以需要先用URLDecoder解码一下,恢复中文
        filePath = URLDecoder.decode(filePath, "UTF-8");

        return new BufferedReader(new FileReader(filePath));
    }

二、直接获取文件流(jar包可用)

方法三:ClassLoader对象的getResourceAsStream()

    /**
     * 方法三:使用类加载器的getResourceAsStream(),直接获取文件流
     * 备注:jar包可用
     *
     * @param fileName
     * @return
     * @throws IOException
     */
    public BufferedReader function3(String fileName) throws IOException {
        //getResourceAsStream(fileName) 等价于getResource(fileName).openStream()
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(fileName);
        if (inputStream == null) {
            throw new FileNotFoundException(fileName);
        }
        return new BufferedReader(new InputStreamReader(inputStream));
    }

方法四:Class对象的getResourceAsStream()

  • ClassLoader 的getResource()是从类路径的根路径查找的,所以不加“/”也可以
  • Class 的getResource()是从当前类所在的包路径查找资源,所以如果不加“/”表示去根路径查找的话,是找不到的
    /**
     * 方法四:使用Class对象的getResourceAsStream()获取文件流
     * 备注:jar包可用
     *
     * @param fileName
     * @return
     * @throws IOException
     */
    public BufferedReader function4(String fileName) throws IOException {
        //getResourceAsStream(fileName) 等价于getResource(fileName).openStream()
        InputStream inputStream = this.getClass().getResourceAsStream("/" + fileName);
        if (inputStream == null) {
            throw new FileNotFoundException(fileName);
        }
        return new BufferedReader(new InputStreamReader(inputStream));
    }

三、使用封装好的类(jar包可用)

源码里还是方法三、方法四,只不过做了一些封装,更方便开发

方法五:Spring提供的ClassPathResource

    /**
     * 方法五:使用Spring提供的ClassPathResource获取
     * 备注:jar包可用
     *
     * @param fileName
     * @return
     * @throws IOException
     */
    public BufferedReader function5(String fileName) throws IOException {
        ClassPathResource classPathResource = new ClassPathResource(fileName);
        InputStream inputStream = classPathResource.getInputStream();
        return new BufferedReader(new InputStreamReader(inputStream));
    }

方法六:Hutool提供的ResourceUtil

    /**
     * 方法六:使用Hutool的ResourceUtil
     * 备注:jar包可用
     *
     * @param fileName
     * @return
     * @throws IOException
     */
    public BufferedReader function6(String fileName) throws IOException {
        List<URL> resources = ResourceUtil.getResources(fileName);
        URL resource = resources.get(0);
        return new BufferedReader(new InputStreamReader(resource.openStream()));
    }

四、测试jar包中是否可用的代码

1)编写接口

   //Jar包启动时根据传入的不同funcation值来选择调用哪个方法测试
    @Value("${function}")
    private int function;    


    @GetMapping("/test")
    public String test() throws IOException {
        //需要在resource里读取的文件
        String fileName = "测试.txt";

        //调用方法
        System.out.println("调用function" + function);
        BufferedReader bufferedReader = null;
        switch (function) {
            case 1:
                bufferedReader = function1(fileName);
                break;
            case 2:
                bufferedReader = function2(fileName);
                break;
            case 3:
                bufferedReader = function3(fileName);
                break;
            case 4:
                bufferedReader = function4(fileName);
                break;
            case 5:
                bufferedReader = function5(fileName);
                break;
            case 6:
                bufferedReader = function6(fileName);
                break;
            default:
        }

        //读取并输出
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = bufferedReader.readLine()) != null) {
            sb.append(line).append("\n");
        }
        System.out.println(sb);
        return sb.toString();
    }

2)启动jar包指令

java -jar -Dfunction=6 read-resource-1.0-SNAPSHOT.jar

  • 更改-Dfunction=6的值就能动态切换方法了。

到此这篇关于SpringBoot项目中读取resource目录下的文件六种方法的文章就介绍到这了,更多相关SpringBoot读取resource文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅析Java语言中状态模式的优点

    浅析Java语言中状态模式的优点

    状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。这个模式将状态封装成独立的类,并将动作委托到 代表当前状态的对象,我们知道行为会随着内部状态而改变
    2023-02-02
  • 浅谈JAVA 异常对于性能的影响

    浅谈JAVA 异常对于性能的影响

    Java的异常处理为什么会影响性能?异常开销很大。那么,这是不是就意味着您不该使用异常?当然不是。但是,何时应该使用异常,何时又不应该使用异常呢?不幸的是,答案不是一下子就说得清楚的,我们来详细探讨下。
    2015-05-05
  • 基于@Bean修饰的方法参数的注入方式

    基于@Bean修饰的方法参数的注入方式

    这篇文章主要介绍了@Bean修饰的方法参数的注入方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java设计模式之状态模式(State模式)介绍

    Java设计模式之状态模式(State模式)介绍

    这篇文章主要介绍了Java设计模式之状态模式(State模式)介绍,本文讲解了何时使用状态模式、如何使用状态模式等内容,需要的朋友可以参考下
    2015-03-03
  • Java雇员管理小项目

    Java雇员管理小项目

    这篇文章主要为大家详细介绍了Java雇员管理小项目,理解面向对象编程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • springboot中的Application.properties常用配置

    springboot中的Application.properties常用配置

    这篇文章主要介绍了springboot中的Application.properties常用配置,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java编码算法与哈希算法深入分析使用方法

    Java编码算法与哈希算法深入分析使用方法

    首先,我们一起来学习一下编码算法,举例说明,ASCII码就是我们常见的一种编码,字母a的编码是十六进制的0x61,字母b是0x62,以此类推。哈希算法,可被称为摘要算法。因此,哈希算法的加密是单向的,不可用密文解密得到明文
    2022-11-11
  • Java项目工程代码深度刨析总结

    Java项目工程代码深度刨析总结

    一个项目工程里的代码是怎样的呢?对于初学者或者没有参与过项目的零经验同学这都是未知且让人好奇的,本篇文章带你一探究竟,踏入真实项目的大门
    2022-08-08
  • SpringSecurity权限控制实现原理解析

    SpringSecurity权限控制实现原理解析

    这篇文章主要介绍了SpringSecurity权限控制实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • java Zookeeper简述

    java Zookeeper简述

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。下面通过本文给大家分享java 中 zookeeper简单使用,需要的朋友参考下吧
    2021-09-09

最新评论