的getResourceAsStream()总是返回空

问题描述:

我在一个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后,它突然停止工作:/

据我所知,该文件具有文件夹中是正确的,其中'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

调用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

我不知道这适用于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?

我认为这样你就可以从“任何地方”(包括服务器位置)获得文件,而且你不需要关心把它放在哪里。

这通常是一个不好的做法,不得不关心这样的事情。

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

当我从Websphere 8.5更改为WebSphere Liberty时,我遇到了同样的问题。

我利用了FileInputStream而不是getResourceAsStream(),因为由于某些原因,WebSphere Liberty无法在WEB-INF文件夹中找到该文件。

剧本:

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

注: 我用这个脚本仅用于开发。

而不是

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

使用

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

通过这种方式,将目光从根,而不是从当前调用类的路径

我有一个类似的问题,我搜索了相当长一段时间的解决方案: 看来,字符串参数区分大小写。所以如果你的文件名是abc.TXT,但是你搜索abc.txt,eclipse会发现它 - 可执行的JAR文件不会。