使用class.getResource()在.jar中加载文件?

时间:2014-09-05 16:50:51

标签: java maven

我的java项目中有以下目录结构:

enter image description here

此项目由Maven管理,当包裹所有资源放入单个.jar文件时。
Utils.java我加载car.jpg,并且由于纹理文件位于类路径上,我使用以下方法获取文件句柄:

URL url = Utils.class.getResource("/textures/car.jpg");

在类路径上获取对文件的引用时,我看到了很多关于使用哪种方法的混淆。
class.getResource()是否使用正确的方法?或class.getResourceAsStream()提供任何好处?

3 个答案:

答案 0 :(得分:1)

除了返回对象之外,两者几乎相同。 getResourceAsStream最终调用getResource并从InputStream对象返回已打开的URL,如ClassLoader类中的以下代码段所示:

public InputStream getResourceAsStream(String name) {
    URL url = getResource(name);
    try {
        return url != null ? url.openStream() : null;
    } catch (IOException e) {
        return null;
    }
}

答案 1 :(得分:0)

http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getResourceAsStream-java.lang.String-

鉴于两个方法的javadocs都说 完全相同 ,我认为没有任何好处

答案 2 :(得分:0)

尽可能远离getResource()。首选getResourceAsStream()。

此规则背后的主要原因是资源的新URL(URL.toString())经常以完全意想不到的方式中断,具体取决于提供原始URL的类加载器。

与第一眼看上去不同的是,两个相同字符串表示的URL 不会被视为相同的,具体取决于它们的构造方式。对于标准化协议的URL来说,这不是问题。但它适用于由ClassLoader生成的URL; ClassLoader可以为您提供以这种方式构建的URL:

 new URL(URL context, String spec, URLStreamHandler handler)

其中ClassLoader指定自己的URLStreamHandler。当此类URL转换为String时,处理程序信息将丢失,并且无法恢复。然后,您有一个看似有效的URL,莫名其妙地无法工作。免除麻烦:)