的getResourceAsStream()总是返回空
我在一个Java Web应用程序的结构如下:的getResourceAsStream()总是返回空
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)
委托给类加载器,并在类路径中搜索资源。换句话说,你当前的代码将不起作用,你应该把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));
但是有没有一种方法可以从我的Web服务调用'getServletContext'? – 2010-05-09 12:44:17
我不知道这适用于JAX-WS,但对于JAX-RS,我能够通过注入ServletContext并调用getResourceAsStream()来访问文件:
@Context ServletContext servletContext;
...
InputStream is = servletContext.getResourceAsStream("/WEB-INF/test_model.js");
请注意,至少在GlassFish 3.1中,路径必须是绝对的,即以斜杠开始。更多这里:How do I use a properties file with jax-rs?
我认为这样你就可以从“任何地方”(包括服务器位置)获得文件,而且你不需要关心把它放在哪里。
这通常是一个不好的做法,不得不关心这样的事情。
Thread.currentThread().getContextClassLoader().getResourceAsStream("abc.properties");
当我从Websphere 8.5更改为WebSphere Liberty时,我遇到了同样的问题。
我利用了FileInputStream
而不是getResourceAsStream()
,因为由于某些原因,WebSphere Liberty无法在WEB-INF
文件夹中找到该文件。
剧本:
FileInputStream fis = new FileInputStream(getServletContext().getRealPath("/")
+ "\WEBINF\properties\myProperties.properties")
注: 我用这个脚本仅用于开发。
而不是
InputStream fstream = this.getClass().getResourceAsStream("abc.txt");
使用
InputStream fstream = this.getClass().getClassLoader().getResourceAsStream("abc.txt");
通过这种方式,将目光从根,而不是从当前调用类的路径
我有一个类似的问题,我搜索了相当长一段时间的解决方案: 看来,字符串参数区分大小写。所以如果你的文件名是abc.TXT,但是你搜索abc.txt,eclipse会发现它 - 可执行的JAR文件不会。
+1欢呼队友,它的工作。我将文件移动到'wservices'并且它的工作正在进行中 – 2010-05-09 09:38:05
如果您使用的是Eclipse,您还需要点击'F5'(刷新),以便您的'abc.txt'出现在资源管理器中,否则getResource()总是返回null 。 – 2014-06-02 12:28:24
我发现单元测试更容易理解文件在Eclipse/maven中的位置,但是当打包和部署时,只有当我将它移动到与该类的位置相匹配时才能使用该文件,因为此答案建议。 – 2014-06-09 19:45:03