getResourceAsStream()始终返回null

时间:2010-05-09 09:18:32

标签: java web-services jboss inputstream

我在Java Web应用程序中有以下结构:

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后,它突然停止了工作:/

7 个答案:

答案 0 :(得分:38)

据我所知,该文件必须位于'this'类所在的文件夹中,即不在WEB-INF/classes中,而是嵌套得更深(除非您在默认包中写入):

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

将文件放入java源代码应该可行,编译器将该文件与类文件一起复制。

答案 1 :(得分:28)

调用Class#getResourceAsStream(String)代理到类加载器,并在类路径中搜索资源。换句话说,您当前的代码将不起作用,您应该将abc.txt放在WEB-INF/classes中,或者放在WEB-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 :(得分:16)

而不是

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

使用

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

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

答案 3 :(得分:7)

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

不得不关心这些事情通常是一种不好的做法。

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

答案 4 :(得分: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?

答案 5 :(得分:1)

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

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

脚本是:

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

注意: 我只使用这个脚本进行开发。

答案 6 :(得分:0)

我有类似的问题,我搜索了一段时间的解决方案: 字符串参数似乎区分大小写。因此,如果您的文件名是abc.TXT,但是您搜索abc.txt,eclipse会找到它 - 可执行的JAR文件赢了。