2011-09-10 52 views
0

下面這段代碼工作正常Java getResource方法僅適用於特定的擴展嗎?

getClass().getResource("/index.xml"); 

然而,當我做了充分的重構來

getClass().getResource("/index.html"); 

上面一行拋出NullPointerException異常。我知道我已經正確地重構了,因爲我使用IDE智能重構來重命名文件,即文件index.html肯定存在於相同的目錄中。當我切換回

getClass().getResource("/index.xml"); 

一切都很好了。爲什麼只有.xml擴展名有效?

回答

1

所以,大多數其他的答案,類/類加載器不應該看的文件擴展名你可以寫一個ClassLoader它這樣做,但它會是奇數。

我會去刺你的問題是什麼。我猜測使用一些IDE(你不指定哪個)將源文件夾中的某些文件複製到目標(jar或類和資源的目錄)。對於Java代碼,您需要編譯的.class目標文件,而不是.java源文件。因此,IDE將被配置爲具有一些合理的默認[magic],以僅複製具有特定擴展名的文件。 HTML文件用於舊包JavaDocs(package-info.html而不是package-info.java,它可以包括軟件包範圍的註釋),所以默認情況下可以合理排除。

因此,您應該調查項目在這方面正在做什麼,並相應地更改任何配置。

0

已識別的Java資源是擴展ResourceBundle或.property文件的類。

您可以編寫自己的擴展,以便從其他擴展中收集資源。

我不確定爲什麼.xml文件是一個可行的擴展。你在使用Java 7嗎?

+0

不,這根本不是真的。 getResource將獲取任何東西 - 基本上它只是在類路徑中找到文件。這不是使用ResourceBundle - 它只是獲取一個URL,然後可以將其讀取爲流。 –

+0

@Jon Ahh!我對來自ResourceBundles的資源和更多的一般資源感到困惑。感謝您的提醒。 –

1

使用getResourceAsStream()應與任何文件擴展名的工作(至少它爲我)

+0

是的,所以'getResource()'。 –

2

由於@a_horse_with_no_name提到,使用getResourceAsStream()能很好地工作的任何文件和任何擴展。

我傾向於認爲(根據所提供的信息)您的IDE在重構後沒有正確刷新其文件層次結構。我建議運行一個完整的清理和構建你的項目,看看是否有助於這種情況。

0

JavaDoc指南:

資源的名稱是獨立的Java實現的;在 特別是,路徑分隔符總是斜槓(/)。但是,Java實現控制資源內容如何映射到文件,數據庫或其他包含實際資源的對象的詳細信息。

資源由一串由 子串組成的字符串標識,由斜槓(/)分隔,後跟資源名稱。 每個子字符串必須是有效的Java標識符。資源名稱爲shortName或shortName.extension形式的 。 shortName和 擴展名都必須是Java標識符。

並閱讀本文告訴我們:使用this算法從給定資源名稱構建絕對資源名稱。

0

getResource()將工作,不管資源的類型。它所做的只是返回URL。這個例子對我來說很好。

public class Example { 
    public static void main(String... args) { 
     System.out.println(Example.class.getResource("jaxb.properties")); 
     System.out.println(Example.class.getResource("test.xml")); 
     System.out.println(Example.class.getResource("foo.html")); 
     System.out.println(Example.class.getResource("danger.exe")); 
    } 
} 
相關問題