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

原来实现

1
2
3
4
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)
1
2
3
URL keyUrl = getClass().getClassLoader().getResource("key.pem");
String key = keyUrl != null ? keyUrl.getFile() : "";
log.info("key: {}", key);

本地开发运行正常:

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

打成jar包后运行异常:

1
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("")会指定要加载的资源路径与当前类所在包的路径一致,因此能正常读取文件。

1
2
3
4
5
6
7
8
9
10
11
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();
}

获取文件路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@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;
}

}
1
2
3
4
5
6
7
8
9
10
11
12
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);

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2020 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :