为了账号安全,请及时绑定邮箱和手机立即绑定

在Java中加载资源的首选方式

在Java中加载资源的首选方式

翻阅古今 2019-08-01 14:37:20
在Java中加载资源的首选方式我想知道在Java中加载资源的最佳方法:this.getClass().getResource() (or getResourceAsStream()),Thread.currentThread().getContextClassLoader().getResource(name),System.class.getResource(name)。
查看完整描述

3 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

根据您的需求制定解决方案......

有两件事情,getResourcegetResourceAsStream()从它被称为的类得到...

  1. 类加载器

  2. 起始位置

所以,如果你这样做

this.getClass().getResource("foo.txt");

它将尝试从与“this”类相同的包中加载foo.txt,并使用“this”类的类加载器。如果你在前面放了一个“/”,那么你绝对是引用资源的。

this.getClass().getResource("/x/y/z/foo.txt")

将从“this”的类加载器和xyz包加载资源(它将需要与该包中的类位于同一目录中)。

Thread.currentThread().getContextClassLoader().getResource(name)

将加载上下文类加载器,但不会根据任何包解析名称(必须绝对引用)

System.class.getResource(name)

将使用系统类加载器加载资源(它必须被绝对引用,因为您将无法将任何内容放入java.lang包(System的包)中。

只需看看来源。还表明getResourceAsStream只是在getResource返回的URL上调用“openStream”并返回它。


查看完整回答
反对 回复 2019-08-01
?
RISEBY

TA贡献1856条经验 获得超5个赞

好吧,如果你真的在派生类中,它部分取决于你想要发生什么。

例如,假设SuperClass在A.jar中并且SubClass在B.jar中,并且您正在声明的实例方法中执行代码,SuperClass但where this指的是实例SubClass。如果你使用this.getClass().getResource()它将看起来相对于SubClassB.jar。我怀疑通常不是必需的。

就个人而言,我可能Foo.class.getResourceAsStream(name)最常使用- 如果你已经知道你所追求的资源的名称,并且你确定它的相对位置Foo,那就是IMO最强大的做法。

当然,有时候这也不是你想要的:根据每个案例的优点来判断。它只是“我知道这个资源与这个类捆绑在一起”是我遇到的最常见的一个。


查看完整回答
反对 回复 2019-08-01
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

我搜索三个地方,如下所示。欢迎评论。

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);}


查看完整回答
反对 回复 2019-08-01
  • 3 回答
  • 0 关注
  • 367 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信