应用场景:
在目前的微服务和容器部署的SpringBoot坏境下,我们一般将项目直接打成 jar包的方式运行(java -jar *),我们可能需要读取resources目录下的自定义文件,想在程序运行时找到该目录,并读取需要的文件。
踩过的坑:
当时我使用System.getProperty("user.dir")获取工作目录的坑,本地idea工具运行没问题,但是一但打成jar包,路径会变成jar包所在的目录,无法读取jar内部的文件,不建议用这种方式。
由于jar中的文件都属于资源的一种,所以获取需从类加载器进行获取。正确的姿势是采用this.getClass().getClassLoader().getResourceAsStream()的方式。
代码示例:
try (BufferedReader in = new BufferedReader(new InputStreamReader(
Objects.requireNonNull(this.getClass()
.getClassLoader().getResourceAsStream(fileName),
"文件未找到:" + fileName),
StandardCharsets.UTF_8)
)) {
// TODO 你的业务代码。。。
} catch (IOException e) {
e.printStackTrace();
}
乱码小提示:
读取自定义文件时,由于getResourceAsStream方法返回的是一个InputStream流,采用InputStreamReader这种方式最好指定一种编码方式,不然可能中文乱码!(我在解析xml时中文乱码)
网友评论