1. 通过File类、InputStream读文件
在普通java项目中,当使用java io(Fie类、FileInputStream类等)读文件,传入相对路径时:
这种方式读文件,文件路径必须是项目的根路径,将文件放在其他任何目录都无法读取到。
2. 读resources下的文件
在maven项目中,想要读取resources下的文件,上面的方法肯定是行不通的:
因为编译后,resources下的文件会 导出到 target目录下的classes文件夹下
而在代码中使用绝对编译后的路径也不符合实际项目需求,该怎么办呢?
其实使用java反射就能获取到文件编译后的绝对路径:
【小结】想要读取maven项目resources下的文件,使用如下代码:
// ClassName替换为具体的类
InputStream inputStream =ClassName.class.getResourceAsStream("/a.xml");
//或者使用:
InputStream inputStream =ClassName.class.getClassLoader().getResourceAsStream("a.xml");
3. 读src目录下的文件
其实在普通项目中也是可以使用反射的方式读配置文件的,但此时不能再将文件置于根目录下,而应该放在src目录下,如:
可见读取配置文件的通用方法之一就是反射:
- 普通java项目就将配置文件放在 src 目录下
- maven 项目就统一放在 resources 下
除了这种方式,java还提供了 一个专门用来读取properties类型文件的类:ResourceBundle
4. ResourceBundle.getBundle
java的ResourceBundle类是用来读取properties的资源文件的,他还支持国际化操作,但需要注意:
- 文件名区分大小写
- 文件扩展名 .properties 要省略、就像对于类可以省略掉 .class扩展名一样
- 资源文件必须位于指定包的路径之下
5. Java读配置文件总结
文件路径:
- 普通java项目就将文件放在 src 目录下
- maven 项目就统一放在 resources 下
通用读取方式:
- properties类型的文件使用 ResourceBundle.getBundle 更简单
- 其他类型的文件用反射的方式即可
代码参考如下:
public static void main(String[] args) throws IOException {
InputStream stream = JDBCDemo.class.getClassLoader().getResourceAsStream("db.properties");
// InputStream stream = JDBCDemo.class.getResourceAsStream("/db.properties"); //也可
Properties properties = new Properties();
properties.load(stream);
String username = properties.getProperty("username");
System.out.println(username);
ResourceBundle bundle = ResourceBundle.getBundle("db");
String temp = bundle.getString("username");
System.out.println(temp);
}