【Web作业开发记录】Java代码读取文件问题
1.问题分析
在项目中需要读取properties文件,而对于gradle项目,在java文件夹底下的properties文件在编译打包时会自动忽略,最终造成NPE。
2.解决方法
对于gradle项目,与java文件夹有一个同级的文件夹resources,里面的文件在编译打包时不会忽略。通过DBUtil的Class类的getResourceAsStream方法获得访问InputStream,即DBUtil.class.getResourceAsStream(“/properties/account.properties”)再通过Properties类的load方法加载该输入流,通过Properties类的getProperty获得数据。
3. 示例代码
try {
Class.forName(DRIVER_CLASS);
Properties properties = new Properties();
properties.load(DBUtil.class.getResourceAsStream("/properties/account.properties"));
URL = properties.getProperty("url");
USERNAME = properties.getProperty("username");
PASSWORD = properties.getProperty("password");
} catch (ClassNotFoundException | IOException | NullPointerException e) {
e.printStackTrace();
System.out.println("Error");
System.exit(1);
}
项目路径图
4. 问题反思
该问题涉及到java代码读取文件的路径问题,现在对Class Loader并不理解。在getResourceAsStream方法的文档中提到,The rules for searching resources associated with a given class are implemented by the defining class loader of the class. 这句话的具体含义无法理解。网上也有提到,形如DBUtil.class.getResourceAsStream()和DBUtil.class.getClassLoader().getResourceAsStream()在使用的时候存在区别。从源码角度看,前者是通过调用后者完成的,但前者在调用前进行了参数的处理。若以”/”开头,则去掉了该”/”,若不是以”/”开头,则认为该name是通过”.”进行分割,并进行了部分处理。
该部分有待进一步学习。