Spring Boot打成jar包后,读取resources目录下的文件

原来实现

File file = ResourceUtils.getFile("classpath:appblog/test.json");
InputStream in = new FileInputStream(file);
InputStreamReader reader = new InputStreamReader(new FileInputStream(file));
BufferedReader br = new BufferedReader(reader)

URL keyUrl = getClass().getClassLoader().getResource("key.pem");
String key = keyUrl != null ? keyUrl.getFile() : "";
log.info("key: {}", key);

本地开发运行正常:

key: ${project_dir}/target/classes/key.pem

打成jar包后运行异常:

com.jcraft.jsch.JSchException: java.io.FileNotFoundException: file:${jar_path}.jar!/BOOT-INF/classes!/key.pem (No such file or directory)"

在调试过程中,文件是真实存在于磁盘的某个目录。此时通过获取文件路径,是可以正常读取的,因为文件确实存在。

而打包成jar以后,实际上文件是存在于jar里面的资源文件,在磁盘是没有真实路径的(\BOOT-INF\classes!appblog/test.json)。所以通过ResourceUtils.getFile或者this.getClass().getResource("")方法无法正确获取文件。

现在实现

读取文件内容

采用流的方式进行处理,同时读取流时设置编码UTF-8,使用InputStream inputStream = this.getClass().getResourceAsStream("")会指定要加载的资源路径与当前类所在包的路径一致,因此能正常读取文件。

StringBuffer stringBuffer = new StringBuffer();
try {
    InputStream stream = getClass().getClassLoader().getResourceAsStream("appblog/test.json");
    BufferedReader br = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
    String line;
    while ((line = br.readLine()) != null) {
        stringBuffer.append(line);
    }
} catch (Exception e) {
    e.printStackTrace();
}

获取文件路径

@Slf4j
@Component
public class ResourceFileHelper {

    public File getFile(String sourceFileName, File targetFile) {
        if (targetFile.exists() && targetFile.length() > 0) return targetFile;
        try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream(sourceFileName)) {
            if (inputStream == null) {
                throw new RuntimeException("Resource file not found");
            }

            FileUtils.copyInputStreamToFile(inputStream, targetFile);
            return targetFile;

        } catch (IOException e) {
            log.error("ResourceFileHelper.getFile exception: ", e);
        }
        return null;
    }

}
String tmpDirPath = System.getProperty("java.io.tmpdir");
File tmpDir = new File(tmpDirPath + File.separator + "kbank");
if (!tmpDir.exists()) {
    boolean mkdirs = tmpDir.mkdirs();
    if (!mkdirs) new RuntimeException("no disk permission");
}

File keyFile = new File(tmpDir, "key.pem");
keyFile = resourceFileHelper.getFile("key.pem", keyFile);

String key = keyFile != null ? keyFile.getAbsolutePath() : "";
log.info("key: {}", key);

版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/25/spring-boot-read-files-in-resources-directory-after-packaged-as-jar/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
Spring Boot打成jar包后,读取resources目录下的文件
原来实现 File file = ResourceUtils.getFile("classpath:appblog/test.json"); InputStream in = new FileInputStream(file); InputStreamReader r……
<<上一篇
下一篇>>
文章目录
关闭
目 录