getResourceAsStream()总是返回null

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

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

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

把文件放到你的java源文件中,编译器会把这个文件和类文件一起复制。

Class#getResourceAsStream(String)调用委托给类加载器,并在类path中search资源。 换句话说,你当前的代码将不起作用,你应该把abc.txt放在WEB-INF/classes ,或者如果打包在一个jar文件中,则放在WEB-INF/lib中。

或者使用ServletContext.getResourceAsStream(String) ,它允许servlet容器从任何位置为Servlet创build一个资源,而不使用类加载器 。 所以从一个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)); 

代替

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

使用

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

这样,它将从根,而不是从当前调用类的path

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

关心这样的事情通常是一个糟糕的做法。

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

我不知道这是否适用于JAX-WS,但是对于JAX-RS,我可以通过注入ServletContext并调用getResourceAsStream()来访问文件:

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

请注意,至less在GlassFish 3.1中,path必须是绝对的,即以斜杠开始。 更多这里: 如何使用jax-rs的属性文件?

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

我利用FileInputStream而不是getResourceAsStream() ,因为WebSphere Liberty无法在WEB-INF文件夹中find该文件。

脚本是:

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

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

我有一个类似的问题,我search了很长一段时间的解决scheme:看来,string参数区分大小写。 所以如果你的文件名是abc.TXT,但是你searchabc.txt,eclipse会发现它 – 可执行的JAR文件不会。