[英]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.