Java资源文件路径问题

这是昨天在 Java 的资源文件读取方面遇到的坑

先说结论

如果在项目中使用资源文件, 那么用Class :: getResourceAsStream(String) : InputStream方法来获取文件内容

再说原因

项目的资源文件, 与在IDE运行中相比, 导出成jar文件后, 所在的路径会发生变化

如果直接用Files :: newInputStream(Paths.get(String path))的方法来获取资源文件内容, 导出成jar文件后会因为路径不同而读取不到

如果使用Class :: getResource(String) : URL方法获取URL后再通过URL :: getPath() : String方法来获取路径, 一样行不通

范例

一个项目文件树

1
2
3
4
5
|- src
|- main
|- java
|- resources
|- database.properties <- the file want to read

不合理代码

1
2
3
4
5
6
7
Properties props = new Properties();
try (InputStream in = Files.newInputStream(Paths.get("src/main/resources/database.properties")) {
props.load(in);
} catch (IOException e) {
logger.error(e.getMessage());
e.printStackTrace();
}

更改后

1
2
3
4
5
6
7
Properties props = new Properties();
try (InputStream in = [ClassName].class.getResourceAsStream("/database.properties")) {
props.load(in);
} catch (IOException e) {
logger.error(e.getMessage());
e.printStackTrace();
}

感谢

  • Morgen_L
  • sand