getResourceAsStream类vs getClass()

时间:2013-06-20 15:26:06

标签: java resources

我正在维护一段代码,我不确定是否有条件。

resourceStream = StorageEngine.class.getResourceAsStream(resourceFile);
if (resourceStream == null) {
    log.info("StorageEngine: didn't find  resource file in the classes root ");
    resourceStream = this.getClass().getResourceAsStream(resourceFile);
}

StorageEngine.class.getResourceAsStream this.getClass()。getResourceAsStream 之间是否存在差异?

TIA

2 个答案:

答案 0 :(得分:1)

  

StorageEngine.class.getResourceAsStream和this.getClass()之间是否真的存在差异.getResourceAsStream?

是的,绝对。

  • 如果资源名称是相对名称,则它将相对于包含相关类
  • 的包
  • 如果两个类在不同的类加载器中,一个可能能够访问资源而另一个不能

当然,如果thisStorageEngine的实例(而不是子类),那么它们实际上是等价的。

答案 1 :(得分:1)

简短的回答:是的,但这两种方法都不是正确的做法。

答案很长:不同的类加载器可以加载不同的类,每个类加载器都可以访问不同的文件集。如果StorageClassthis由不同的类加载器加载,则完全有可能一个调用将返回null而另一个调用成功。

最好的全能方法如下:

Thread.currentThread().getContextClassLoader().getResourceAsStream("/absolute_path");

在一个简单的打包应用程序中,有些人认为这有点过分。它在Web应用程序中非常有用,其中应用程序的不同部分可能由不同的类加载器加载。

时间,IMO,您应该使用显式类加载,当您编写库代码并希望确保您获得您的副本时特定资源。这种情况极为罕见;通常,库希望使用应用程序打包的资源。