getResourceAsStream()始终返回null

And*_*ech 46 java jboss web-services inputstream

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

TheProject
  -- [Web Pages]
  -- -- [WEB-INF]
  -- -- -- abc.txt
  -- -- index.jsp
  -- [Source Packages]
  -- -- [wservices]
  -- -- -- WS.java
Run Code Online (Sandbox Code Playgroud)

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

InputStream fstream = this.getClass().getResourceAsStream("abc.txt");
Run Code Online (Sandbox Code Playgroud)

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

我可能做错了什么想法?

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

Jar*_*uba 40

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

net/domain/pkg1/MyClass.java  
net/domain/pkg1/abc.txt
Run Code Online (Sandbox Code Playgroud)

将文件放入java源代码应该可以工作,编译器将该文件与类文件一起复制.

  • 如果您正在使用Eclipse,则还需要点击"F5"(刷新),以便您的"abc.txt"出现在包资源管理器中,否则getResource()始终返回null. (3认同)

Pas*_*ent 30

Class#getResourceAsStream(String)在类路径中搜索对类加载器和资源的委托的调用.换句话说,你当前的代码将无法正常工作,你应该把abc.txtWEB-INF/classes,或者WEB-INF/lib如果打包在一个jar文件.

使用ServletContext.getResourceAsStream(String)允许servlet容器来使资源可从任何地点一个servlet,而无需使用一个类加载器.所以从Servlet中使用它:

this.getServletContext().getResourceAsStream("/WEB-INF/abc.txt") ;
Run Code Online (Sandbox Code Playgroud)

但有没有办法可以从我的Web服务调用getServletContext?

如果您使用的是JAX-WS,那么您可以WebServiceContext注入:

@Resource
private WebServiceContext wsContext;
Run Code Online (Sandbox Code Playgroud)

然后得到ServletContext它:

ServletContext sContext= wsContext.getMessageContext()
                             .get(MessageContext.SERVLET_CONTEXT));
Run Code Online (Sandbox Code Playgroud)

  • 但有没有办法可以从我的Web服务中调用`getServletContext`? (2认同)

Mik*_*ell 22

代替

InputStream fstream = this.getClass().getResourceAsStream("abc.txt"); 
Run Code Online (Sandbox Code Playgroud)

使用

InputStream fstream = this.getClass().getClassLoader().getResourceAsStream("abc.txt");
Run Code Online (Sandbox Code Playgroud)

这样它将从根目录开始,而不是从当前调用类的路径看

  • 伙计,我在与空指针和 BOOM 斗争了 3 个小时,您的评论...thanx) (2认同)

jed*_*diz 7

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

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

Thread.currentThread().getContextClassLoader().getResourceAsStream("abc.properties");
Run Code Online (Sandbox Code Playgroud)


Mat*_*ell 5

我不知道这是否适用于JAX-WS,但是JAX-RS我能够通过注入ServletContext中,然后就可以调用的getResourceAsStream()来访问文件:

@Context ServletContext servletContext;
...
InputStream is = servletContext.getResourceAsStream("/WEB-INF/test_model.js");
Run Code Online (Sandbox Code Playgroud)

请注意,至少在GlassFish 3.1中,路径必须是绝对路径,即以斜线开头.更多信息:如何使用jax-rs属性文件?