[Java] getResourceAsStream()总是返回null


Answers

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));
Question

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




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

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

该脚本是:

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

注意:我仅将此脚本用于开发。




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

通常不得不关心这些事情。

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





Links