在 Java 中加载资源的首选方式
我想知道在Java中加载资源的最佳方法:
-
this.getClass().getResource() (or getResourceAsStream())
, -
Thread.currentThread().getContextClassLoader().getResource(name)
, -
System.class.getResource(name)
.
我想知道在Java中加载资源的最佳方法:
this.getClass().getResource() (or getResourceAsStream())
,Thread.currentThread().getContextClassLoader().getResource(name)
,System.class.getResource(name)
.根据您想要的内容制定解决方案...
有两件事/将从它被调用的类中获得...getResource
getResourceAsStream()
所以如果你这样做
this.getClass().getResource("foo.txt");
它将尝试从与“this”类相同的包中加载foo.txt,并使用“this”类的类装入器。如果你在前面放一个“/”,那么你绝对引用了资源。
this.getClass().getResource("/x/y/z/foo.txt")
将从“this”的类装入器和 x.y.z 包中装入资源(它需要与该包中的类位于同一目录中)。
Thread.currentThread().getContextClassLoader().getResource(name)
将使用上下文类装入器加载,但不会根据任何包解析名称(必须绝对引用)
System.class.getResource(name)
将使用系统类加载器加载资源(也必须绝对引用它,因为您将无法将任何内容放入java.lang包(System的包)中)。
只需看一下来源。还指示 getResourceAsStream 只在从 getResource 返回的 URL 上调用“openStream”并返回该 URL。
好吧,这部分取决于如果你真的在派生类中,你想发生什么。
例如,假设在 A.jar 和 B.jar 中,并且您正在一个实例方法中执行代码,该方法声明在 中,但其中引用了 的实例。如果使用,它看起来相对于 B.jar 中的 。我怀疑这通常不是必需的。SuperClass
SubClass
SuperClass
this
SubClass
this.getClass().getResource()
SubClass
就我个人而言,我可能会最常使用 - 如果您已经知道所追求的资源的名称,并且您确定它相对于的位置,那么这是IMO最强大的方法。Foo.class.getResourceAsStream(name)
Foo
当然,有时候这不是你想要的:根据每个案件的是非曲直来判断。只是“我知道这个资源与这个类捆绑在一起”是我遇到的最常见的一个。