ClassLoader.getResourceAsStream()混淆

时间:2014-11-16 03:59:22

标签: java classloader contextclassloader

我是Java的新手。

我需要加载配置文件(在app启动时只有一次)。做这个的最好方式是什么?我有以下想法:

  • Thread.currentThread().getContextClassLoader().getResourceAsStream(resourceName);
  • getClass().getClassLoader().getResourceAsStream(resourceName);

这两个中哪个最好,为什么?

比如说,我有一个像下面这样的方法

public void loadConfig(String name) {
    InputStream streamByContextClassLoader = Thread.currentThread().getContextClassLoader().getResourceAsStream(name);
}

如果我多次调用此方法,配置文件是否多次加载?任何请说明我的疑问吗?

2 个答案:

答案 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()。'