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文件不会。