我是Java的新手。
我需要加载配置文件(在app启动时只有一次)。做这个的最好方式是什么?我有以下想法:
Thread.currentThread().getContextClassLoader().getResourceAsStream(resourceName);
getClass().getClassLoader().getResourceAsStream(resourceName);
这两个中哪个最好,为什么?
比如说,我有一个像下面这样的方法
public void loadConfig(String name) {
InputStream streamByContextClassLoader = Thread.currentThread().getContextClassLoader().getResourceAsStream(name);
}
如果我多次调用此方法,配置文件是否多次加载?任何请说明我的疑问吗?
答案 0 :(得分:0)
Java在运行时使用多个类加载器。使用显式文件声明而不是资源会更简单。看看Commons Configuration。
在Java类加载器上,您可以在Oracle official docs中阅读。如果在类中打包配置(到jar文件中) - 可以使用YourClass.class.getResourceAsStream(...)。在其他情况下 - 更喜欢使用显式配置文件。
是的,多次调用getResourceAsStream会多次加载此资源。为了澄清这一点,请查看java.net.URLClassLoader#getResourceAsStream源代码。
答案 1 :(得分:0)
我建议使用第一种方法,因为它适用于第二种方法不适用的情况:
Thread.currentThread().getContextClassLoader().getResourceAsStream(resourceName);
我最初在JUnit测试中使用了第二种方法,然后我们不得不改变它以使用上下文类加载器来允许从IDE运行测试。
请参阅:Difference between thread's context class loader and normal classloader,尤其是此行
'在这种情况下,如果对象需要加载其自己的类加载器上不可用的资源,则需要直接使用Thread.currentThread()。getContextClassLoader()。'