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全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论