错误主要发生在InputStream输入流读取配置文件的方式。
比如:
//方式一
InputStream is=ClassLoader.getSystemClassLoader().getResourceAsStream("jdbcConnection.properties");
//方式二
InputStream is=JdbcUtils.class.getClassLoader().getResourceAsStream("jdbcConnection.properties");
其中,jdbcConnection.properties为配置文件名。
`JdbcUtils.class.getClassLoader().getResourceAsStream("jdbcConnection.properties")` 和 `ClassLoader.getSystemClassLoader().getResourceAsStream("jdbcConnection.properties")` 有如下区别:
1. `JdbcUtils.class.getClassLoader().getResourceAsStream("jdbcConnection.properties")` 是从当前类的类加载器中获取资源,而 `ClassLoader.getSystemClassLoader().getResourceAsStream("jdbcConnection.properties")` 是从系统类加载器中获取资源。
2. `JdbcUtils.class.getClassLoader().getResourceAsStream("jdbcConnection.properties")` 可以加载`jdbcConnection.properties`文件放在类路径中任意一个位置下,但是`ClassLoader.getSystemClassLoader().getResourceAsStream("jdbcConnection.properties")`只能加载类路径下最顶层的`jdbcConnection.properties`文件。
3. 如果多个类加载器加载同一个文件,它们所加载的文件不是同一个文件,也就是说,即使文件内容相同,但是由于不同的类加载器加载,它们对应的 `getResourceAsStream()` 方法所返回的 InputStream 实例也是不同的。
因此,如果`jdbcConnection.properties`文件位于类路径中的某个子路径或者需要使用自定义的类加载器来加载,那么就应该使用 `JdbcUtils.class.getClassLoader().getResourceAsStream("jdbcConnection.properties")` 来获取资源。否则,使用 `ClassLoader.getSystemClassLoader().getResourceAsStream("jdbcConnection.properties")` 来方便的获取资源。