You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中如何用@Value注解匹配前缀文件名?

问题解答

直接通过@Value("${input.file-path}/Students_Input_*.dat")这种方式无法直接获取到具体的文件路径,因为@Value注解的核心是读取配置文件中的字符串值,并不会自动去文件系统中匹配通配符对应的实际文件。

要实现你的需求,可以用以下几种方案:

方案一:使用ResourceLoader匹配文件

注入ResourceLoader,在初始化阶段通过通配符加载目标资源,再提取文件绝对路径:

import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.io.IOException;

@Component
public class FileHandler {
    private final ResourceLoader resourceLoader;
    private String inputFileStudents;
    private String inputFileWorkers;

    public FileHandler(ResourceLoader resourceLoader) {
        this.resourceLoader = resourceLoader;
    }

    @PostConstruct
    public void initFilePaths() throws IOException {
        String basePath = System.getProperty("input.file-path");
        
        // 匹配学生文件
        Resource[] studentResources = resourceLoader.getApplicationContext()
                .getResources("file:" + basePath + "/Students_Input_*.dat");
        if (studentResources.length > 0) {
            inputFileStudents = studentResources[0].getFile().getAbsolutePath();
        }

        // 匹配工人文件
        Resource[] workerResources = resourceLoader.getApplicationContext()
                .getResources("file:" + basePath + "/Workers_Input_*.dat");
        if (workerResources.length > 0) {
            inputFileWorkers = workerResources[0].getFile().getAbsolutePath();
        }
    }

    // 提供getter方法获取路径
    public String getInputFileStudents() {
        return inputFileStudents;
    }

    public String getInputFileWorkers() {
        return inputFileWorkers;
    }
}

注意:如果路径下匹配到多个符合通配符的文件,上述代码会取第一个,可根据业务需求调整逻辑(如抛出异常、收集所有文件路径等)。

方案二:结合@ConfigurationProperties与Java文件API

  1. 先定义配置类绑定基础路径:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "input")
public class InputConfig {
    private String filePath;

    public String getFilePath() {
        return filePath;
    }

    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }
}
  1. 在业务类中注入配置类,用Java文件API匹配前缀:
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.io.File;

@Component
public class FileResolver {
    private final InputConfig inputConfig;
    private String inputFileStudents;
    private String inputFileWorkers;

    public FileResolver(InputConfig inputConfig) {
        this.inputConfig = inputConfig;
    }

    @PostConstruct
    public void resolveTargetFiles() {
        File targetDir = new File(inputConfig.getFilePath());
        
        // 匹配学生文件
        File[] studentFiles = targetDir.listFiles((dir, fileName) -> 
                fileName.startsWith("Students_Input_") && fileName.endsWith(".dat"));
        if (studentFiles != null && studentFiles.length > 0) {
            inputFileStudents = studentFiles[0].getAbsolutePath();
        }

        // 匹配工人文件
        File[] workerFiles = targetDir.listFiles((dir, fileName) -> 
                fileName.startsWith("Workers_Input_") && fileName.endsWith(".dat"));
        if (workerFiles != null && workerFiles.length > 0) {
            inputFileWorkers = workerFiles[0].getAbsolutePath();
        }
    }

    // getter方法
    public String getInputFileStudents() {
        return inputFileStudents;
    }

    public String getInputFileWorkers() {
        return inputFileWorkers;
    }
}

补充说明

  • 两种方案都需要处理多文件匹配的场景,需根据业务规则决定如何处理多个符合条件的文件。
  • 确保应用程序对目标目录有读取权限,否则会触发文件访问异常。

内容的提问来源于stack exchange,提问作者Somebody

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 19:55:21