0

我是 Java 新手。

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

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

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

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

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

如果我多次调用此方法,配置文件是否加载了多次?任何人都可以澄清我的疑问吗?

4

2 回答 2

0

Java 在运行时使用了几个类加载器。使用显式文件声明而不是资源会简单得多。看看Commons Configuration

在 Java 类加载器上,您可以阅读 Oracle官方文档。如果你在你的类中打包配置(到 jar 文件中) - 你可以使用 YourClass.class.getResourceAsStream(...)。在其他情况下 - 更喜欢使用显式配置文件。

是的,多次调用 getResourceAsStream 将多次加载该资源。为了澄清这一点,请查看 java.net.URLClassLoader#getResourceAsStream 源。

于 2014-11-16T04:09:42.210 回答
0

我建议使用第一种方法,因为它适用于第二种方法不起作用的情况:

Thread.currentThread().getContextClassLoader().getResourceAsStream(resourceName);

我曾经最初在 JUnit 测试中使用第二种方法,然后我们不得不将其更改为使用上下文类加载器以允许从 IDE 运行测试。

请参阅:线程的上下文类加载器和普通类加载器之间的区别,特别是这一行

“在这种情况下,对象需要直接使用 Thread.currentThread().getContextClassLoader() 如果它想要加载它自己的类加载器上不可用的资源。”

于 2014-11-16T04:10:54.483 回答