总结SpringBoot项目中读取resource目录下的文件多种方法

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、获取绝对路径再读取文件(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包可用)

1.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));
    }

2.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包可用)

1、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));
    }

2、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包中是否可用的代码

   //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();
    }

到此这篇关于SpringBoot项目中读取resource目录下的文件六种方法的文章就介绍到这了

### Spring Boot 读取 Resources 文件夹相对路径的方法Spring Boot 中,`resources` 目录通常用于存储应用程序所需的静态资源文件。为了正确读取 `resources` 下的文件并处理其相对路径,有多种方法可供选择。 #### 使用 ResourceUtils 获取 Classpath 资源 一种常见的方式是利用 `ResourceUtils` 类来访问位于 classpath 上的资源。此工具类提供了便捷的方法以获取文件对象: ```java import org.springframework.util.ResourceUtils; import java.io.File; public void readClassPathFile() { try { // 将 "classpath:" 前缀与目标文件名组合起来定位资源位置 File file = ResourceUtils.getFile("classpath:config/settings.properties"); // 进一步对文件进行操作... } catch (Exception e) { System.out.println(e.getMessage()); } } ``` 这种方法适用于大多数场景,在开发环境以及打后的 jar/war 文件内部均能正常运作[^4]。 #### 利用 @Value 注解读取配置项定义的路径 当需要动态加载不同环境下可能变化的文件时,可以在 application.yml 或 .properties 文件内预先设定占位符变量,并借助于 `@Value` 注解注入这些值至 Java Bean 属性中: ```yaml app: configDir: /data/config/ ``` ```java @Component public class ConfigLoader { private final String configDirectory; public ConfigLoader(@Value("${app.configDir}") String dir){ this.configDirectory = dir; } public void loadConfigFiles(){ Path path = Paths.get(configDirectory); if (!Files.exists(path)){ throw new RuntimeException("Configuration directory does not exist."); } // 执行更多逻辑... } } ``` 对于此类情况,如果希望基于项目的根目录构建相对路径,则应确保所给定的基础路径字符串能够被解释为相对于当前工作目录的位置[^2]。 #### 自动创建不存在的目标文件夹 有时业务需求可能会涉及到按需建立某些特定结构的数据存储空间。此时可以通过如下代码片段实现自动检测并初始化必要的子目录: ```java import org.springframework.util.ResourceUtils; import java.nio.file.Files; import java.nio.file.Path; public static void ensureDirectoryExists(String locationPropertyKey) throws Exception{ File targetFolder = new File(ResourceUtils.getURL(locationPropertyKey).getPath()); if(!targetFolder.exists()){ Files.createDirectories(targetFolder.toPath()); } } ``` 上述函数会尝试依据传入的关键字参数解析出对应的 URL 表达形式,并据此判断相应物理地址是否存在;一旦发现缺失即刻完成新建动作[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cesske

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值