getResourceAsStream() 始终返回 null

2022-08-31 20:27:05

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

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

在 中,我在 Web 方法中使用以下代码:WS.java

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

但它总是返回一个空值。我需要从该文件中读取,并且我读到,如果您将文件放入,则可以使用访问它们,但该方法始终返回.WEB-INFgetResourceAsStreamnull

任何关于我可能做错了什么的想法?

顺便说一句,奇怪的是这是有效的,但是在我对项目执行了一个之后,它突然停止工作了:/Clean and Build


答案 1

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

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

将文件放入 Java 源代码中应该可以正常工作,编译器会将该文件与类文件一起复制。


答案 2

Class#getResourceAsStream(String) 的调用委托给类装入器,并在类路径中搜索资源。换句话说,您当前的代码将无法正常工作,您应该放入 ,或者如果打包在jar文件中,则应放入。abc.txtWEB-INF/classesWEB-INF/lib

或者使用 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));

推荐