2009-05-17 17 views
4

我有一個使用一些txt文件的jar文件。爲了得到它們,它使用Class.getResourceAsStream函數。getResourceAsStream不適用於每個類?

Class A 
{ 
    public InputStream getInputStream(String path) throws Exception { 
     try { 
      return new FileInputStream(path); 
     } catch (FileNotFoundException ex) { 
      InputStream inputStream = getClass().getResourceAsStream(path); 
      if (inputStream == null) 
       throw new Exception("Failed to get input stream for file " + path); 
      return inputStream; 
     } 
    } 
} 

此代碼工作正常。

問題是,如果我將類A定義爲extends java.io.File,則我從getResourceAsStream獲得的InputStream爲null。

而且,如果我離開A級爲常規類(非繼承),並定義B級爲:

Class B extends java.io.File 
{ 
    public InputStream getInputStream(String path) throws Exception 
    { 
    return new A().getInputStream(path); 
} 
} 

返回的InputStream仍然是空。

什麼問題?有沒有辦法從繼承File的類訪問該文件?

感謝,

回答

10

我懷疑這是多用包不是繼承的事。

如果您的課程在一個包中,那麼getResourceAsStream()將與該包相關,除非您以「/」開頭(使其成爲「絕對」資源)。另一種方法是使用getClass().getClassLoader().getResourceAsStream(),它不知道路徑與包相關。

只是繼承File應該不會影響行爲。如果你確實相信它,請發佈一個簡短但完整的程序來演示問題。

+0

你說得對。問題是不同的。看到我的答案。謝謝! – Dikla 2009-05-17 08:23:50

0

對不起,問題是不一樣的。 (實際上沒有問題......)

在繼承自java.io.File的類中,我使用getPath()以獲取資源的路徑。但路徑反斜槓而不是正斜槓(因爲我在Windows操作系統上工作)。當我使用正斜槓時,即使在使用繼承類時也是如此。

1

恕我直言,它仍然更好使用getClass().getClassLoader().getResourceAsStream(),因爲如果你的子類(和子類在另一個pacakge)上面的代碼可能會失敗,並調用父母方法。

4

這裏有一些例子,備份喬恩斯基特的解釋:

前提:你有一個類my.package.A取決於foo.txt的。

  1. 如果使用my.package.A.class.getResourceAsStream(「foo.txt的」),並放置foo.txt的在你的jar文件我/包/ foo.txt的,那麼當你運行類它應該找到foo.txt。如果你使用my.package.A.class.getClassLoader()。getResourceAsStream(「foo.txt」),然後將foo.txt放在類路徑上的任何文件夾中,當你運行類A時,它應該找到foo。文本。

  2. 如果您使用my.package.A.class.getResourceAsStream(「/ foo.txt」)並將foo.txt放在我的jar文件的/foo.txt中,那麼當您運行項目A時,它應該找到foo.txt的。

+0

我很喜歡這個解釋!非常感謝你澄清它... – 2013-12-12 01:01:02