使用类加载器(ClassLoader)加载配置文件
我们之前就知道Properties是用来读取配置文件的类,但是我们使用Properties读取配置文件之前,我们先要将我们的配置文件加载到内存中来
方式一: 使用输入流将配置文件加载到内存中来
eg:
package 反射.类加载器加载配置文件;
import java.io.IOException;
import java.util.Properties;
import java.io.FileInputStream;
public class Demo {
public static void main(String[] args) throws IOException {
/*
创建一个Properties类的对象
*/
Properties pros = new Properties();
/*
创建一个字节输入流对象
注意: 使用输入流来读取文件时默认在当前项目下查找
*/
FileInputStream fis = new FileInputStream("jdbc.properties");
//调用Properties类的load()方法来读取加载到内存中的配置文件
pros.load(fis);
/*
获取配置文件中的信息
*/
String user = pros.getProperty("user");
String password = pros.getProperty("password");
//打印输出
System.out.println("user = " + user + ",password = " + password);
}
}
方式二: 使用ClassLoader(类加载器)将配置文件加载到内存中来
eg:
package 反射.类加载器加载配置文件;
import java.io.IOException;
import java.util.Properties;
import java.io.InputStream;
public class Demo2 {
public static void main(String[] args) throws IOException {
/*
创建Properties类的对象
*/
Properties pros = new Properties();
/*
通过自定义类Demo2(也就是本类)调用class属性得到对应的Class实例,然后通过调用getClassLoader()方法得到一个
系统类加载器对象
*/
ClassLoader classLoader = Demo2.class.getClassLoader();
/*
通过系统类加载器对象调用getResourceAsStream()方法以流的形式获取资源,将配置文件加载到内存中
注意: 我们使用类加载器的getResourceAsStream(String path)方法来获取资源时默认是在本项目的src文件目录之下获取
*/
InputStream is = classLoader.getResourceAsStream("jdbc.properties");
/*
调用Properties类的load()方法来加载读取配置文件
*/
pros.load(is);
/*
获取配置文件中的信息
*/
String user = pros.getProperty("user");
String password = pros.getProperty("password");
/*
打印输出信息
*/
System.out.println("user = " + user + ",password = " + password);
}
}
总结:
- 使用输入流的形式加载文件到内存中时默认是在本项目之下
- 如果是单元测试方法中,而不是main()方法中,那么就是默认在当前module之下
- 通过类加载器的getResourceAsStream()方法来加载文件到内存中默认是在本项目的src之下
- 如果是在单元测试方法中,而不是main()方法中,那么就是在当前module的src之下
- 单元测试方法就是使用@Test注解标签的方法
- 单元测试和main()方法一样也可以运行
补充:
我们一般建议将文件存储在项目中的src之下,而不是直接存储在当前项目中,因为以后我们在学习到web前端之后我们部署到Tomcat服务器中之后,本项目之下的配置文件就会缺失,所以我们建议将文件放在项目的src之下
-
那么有的人会提出疑问: “如果我们将文件放到了项目的src之下,但是这个时候我们使用输入流加载文件到内存时怎么办?”
我们知道使用输入流的方式加载文件默认是在当前项目之下查找,那么这个时候我们只要在我们要加载的文件前面加上src/即可
- 那么不就相当于是在当前项目之下的src之下查找了
- eg:
FileInputStream fis = new FileInputStream("src/jdbc.properties"); //或者换成src\\也是一样的 FileInputStream fis2 = new FileInputStream("src\\jdbc.properties");