我想知道在Java中加载资源的最佳方法:
this.getClass().getResource() (or getResourceAsStream()),Thread.currentThread().getContextClassLoader().getResource(name),System.class.getResource(name).Mic*_*les 134
根据您的需求制定解决方案......
有两件事情,getResource/ getResourceAsStream()从它被称为的类得到...
所以,如果你这样做
this.getClass().getResource("foo.txt");
Run Code Online (Sandbox Code Playgroud)
它将尝试从与"this"类相同的包中加载foo.txt,并使用"this"类的类加载器.如果你在前面放了一个"/",那么你绝对是引用资源的.
this.getClass().getResource("/x/y/z/foo.txt")
Run Code Online (Sandbox Code Playgroud)
将从"this"的类加载器和xyz包加载资源(它将需要与该包中的类位于同一目录中).
Thread.currentThread().getContextClassLoader().getResource(name)
Run Code Online (Sandbox Code Playgroud)
将加载上下文类加载器,但不会根据任何包解析名称(必须绝对引用)
System.class.getResource(name)
Run Code Online (Sandbox Code Playgroud)
将加载与系统类加载器的资源(它必须是绝对引用为好,因为你将不能够将任何东西放入java.lang包(包系统).
只需看看来源.还表明getResourceAsStream只是在getResource返回的URL上调用"openStream"并返回它.
Jon*_*eet 14
好吧,如果你真的在派生类中,它部分取决于你想要发生什么.
例如,假设SuperClass在A.jar中并且SubClass在B.jar中,并且您正在声明的实例方法中执行代码,SuperClass但where this指的是实例SubClass.如果你使用this.getClass().getResource()它将看起来相对于SubClassB.jar.我怀疑通常不是必需的.
就个人而言,我可能Foo.class.getResourceAsStream(name)最常使用- 如果你已经知道你所追求的资源的名称,并且你确定它的相对位置Foo,那就是IMO最强大的做法.
当然,有时候这也不是你想要的:根据每个案例的优点来判断.它只是"我知道这个资源与这个类捆绑在一起"是我遇到的最常见的一个.
我搜索三个地方,如下所示.欢迎评论.
public URL getResource(String resource){
URL url ;
//Try with the Thread Context Loader.
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
if(classLoader != null){
url = classLoader.getResource(resource);
if(url != null){
return url;
}
}
//Let's now try with the classloader that loaded this class.
classLoader = Loader.class.getClassLoader();
if(classLoader != null){
url = classLoader.getResource(resource);
if(url != null){
return url;
}
}
//Last ditch attempt. Get the resource from the classpath.
return ClassLoader.getSystemResource(resource);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
113085 次 |
| 最近记录: |