我正在维护一段代码,我不确定是否有条件。
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
答案 0 :(得分:1)
StorageEngine.class.getResourceAsStream和this.getClass()之间是否真的存在差异.getResourceAsStream?
是的,绝对。
当然,如果this
是StorageEngine
的实例(而不是子类),那么它们实际上是等价的。
答案 1 :(得分:1)
简短的回答:是的,但这两种方法都不是正确的做法。
答案很长:不同的类加载器可以加载不同的类,每个类加载器都可以访问不同的文件集。如果StorageClass
和this
由不同的类加载器加载,则完全有可能一个调用将返回null
而另一个调用成功。
最好的全能方法如下:
Thread.currentThread().getContextClassLoader().getResourceAsStream("/absolute_path");
在一个简单的打包应用程序中,有些人认为这有点过分。它在Web应用程序中非常有用,其中应用程序的不同部分可能由不同的类加载器加载。
仅时间,IMO,您应该使用显式类加载,当您编写库代码并希望确保您获得您的副本时特定资源。这种情况极为罕见;通常,库希望使用应用程序打包的资源。