簡體   English   中英

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

[英]Use class.getResource() to load file within .jar?

我的java項目中有以下目錄結構:

在此輸入圖像描述

該項目由Maven管理,當包將所有資源放入單個.jar文件中時。
Utils.java我正在加載car.jpg ,並且因為紋理文件在類路徑上,所以我使用以下方法來獲取文件的句柄:

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

我看到很多關於在類路徑上獲取對文件的引用時使用哪種方法的困惑。
class.getResource()是否使用正確的方法? 或者class.getResourceAsStream()提供任何好處?

除返回對象外,兩者幾乎相同。 getResourceAsStream最終調用getResource並從URL對象返回一個打開的InputStream ,如以下ClassLoader類的片段所示:

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

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

鑒於javadocs對兩種方法都說完全相同 ,我認為沒有任何好處

盡可能遠離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,莫名其妙地無效。 免除麻煩:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM