2010-05-09 221 views
39

我在一個Java Web應用程序的結構如下:的getResourceAsStream()總是返回空

TheProject 
    -- [Web Pages] 
    -- -- [WEB-INF] 
    -- -- -- abc.txt 
    -- -- index.jsp 
    -- [Source Packages] 
    -- -- [wservices] 
    -- -- -- WS.java 

WS.java,我使用下面的代碼在Web方法:

InputStream fstream = this.getClass().getResourceAsStream("abc.txt"); 

但它總是返回null。我需要從該文件中讀取數據,並且如果將文件放在WEB-INF中,則可以使用getResourceAsStream訪問它們,但該方法始終返回null

任何想法,我可能做錯了什麼?

順便說一下,奇怪的是,這是工作,但我對項目進行Clean and Build後,它突然停止工作:/

回答

35

據我所知,該文件具有文件夾中是正確的,其中'this'居住類,即不是在WEB-INF/classes但嵌套更深的(除非你在默認包寫):

net/domain/pkg1/MyClass.java 
net/domain/pkg1/abc.txt 

把文件到您的Java源代碼應該工作,與類文件一起文件,編譯器的副本。

+0

+1歡呼隊友,它的工作。我將文件移動到'wservices'並且它的工作正在進行中 – 2010-05-09 09:38:05

+3

如果您使用的是Eclipse,您還需要點擊'F5'(刷新),以便您的'abc.txt'出現在資源管理器中,否則getResource()總是返回null 。 – 2014-06-02 12:28:24

+0

我發現單元測試更容易理解文件在Eclipse/maven中的位置,但是當打包和部署時,只有當我將它移動到與該類的位置相匹配時才能使用該文件,因爲此答案建議。 – 2014-06-09 19:45:03

28

調用Class#getResourceAsStream(String)委託給類加載器,並在類路徑中搜索資源。換句話說,你當前的代碼將不起作用,你應該把abc.txt放在WEB-INF/classesWEB-INF/lib如果打包在一個jar文件中。

或者使用ServletContext.getResourceAsStream(String)允許servlet容器來使資源可從任何地點一個servlet,而無需使用一個類加載器。因此,使用這種從Servlet:

this.getServletContext().getResourceAsStream("/WEB-INF/abc.txt") ; 

但是,有沒有辦法,我可以從我的Web服務調用的getServletContext?

如果您使用的JAX-WS,那麼你就可以得到一個WebServiceContext注入:

@Resource 
private WebServiceContext wsContext; 

然後拿到ServletContext從中:

ServletContext sContext= wsContext.getMessageContext() 
          .get(MessageContext.SERVLET_CONTEXT)); 
+2

但是有沒有一種方法可以從我的Web服務調用'getServletContext'? – 2010-05-09 12:44:17

5

我不知道這適用於JAX-WS,但對於JAX-RS,我能夠通過注入ServletContext並調用getResourceAsStream()來訪問文件:

@Context ServletContext servletContext; 
... 
InputStream is = servletContext.getResourceAsStream("/WEB-INF/test_model.js"); 

請注意,至少在GlassFish 3.1中,路徑必須是絕對的,即以斜槓開始。更多這裏:How do I use a properties file with jax-rs?

6

我認爲這樣你就可以從「任何地方」(包括服務器位置)獲得文件,而且你不需要關心把它放在哪裏。

這通常是一個不好的做法,不得不關心這樣的事情。

Thread.currentThread().getContextClassLoader().getResourceAsStream("abc.properties"); 
1

當我從Websphere 8.5更改爲WebSphere Liberty時,我遇到了同樣的問題。

我利用了FileInputStream而不是getResourceAsStream(),因爲由於某些原因,WebSphere Liberty無法在WEB-INF文件夾中找到該文件。

劇本:

FileInputStream fis = new FileInputStream(getServletContext().getRealPath("/") 
         + "\WEBINF\properties\myProperties.properties") 

注: 我用這個腳本僅用於開發。

8

而不是

InputStream fstream = this.getClass().getResourceAsStream("abc.txt"); 

使用

InputStream fstream = this.getClass().getClassLoader().getResourceAsStream("abc.txt"); 

通過這種方式,將目光從根,而不是從當前調用類的路徑

0

我有一個類似的問題,我搜索了相當長一段時間的解決方案: 看來,字符串參數區分大小寫。所以如果你的文件名是abc.TXT,但是你搜索abc.txt,eclipse會發現它 - 可執行的JAR文件不會。