我在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
后,它突然停止了工作:/
答案 0 :(得分:38)
据我所知,该文件必须位于'this'
类所在的文件夹中,即不在WEB-INF/classes
中,而是嵌套得更深(除非您在默认包中写入):
net/domain/pkg1/MyClass.java
net/domain/pkg1/abc.txt
将文件放入java源代码应该可行,编译器将该文件与类文件一起复制。
答案 1 :(得分:28)
调用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));
答案 2 :(得分:16)
而不是
InputStream fstream = this.getClass().getResourceAsStream("abc.txt");
使用
InputStream fstream = this.getClass().getClassLoader().getResourceAsStream("abc.txt");
通过这种方式,它将从根目录开始,而不是从当前调用类的路径
答案 3 :(得分:7)
我认为这样你可以从“任何地方”(包括服务器位置)获取文件,而你不需要关心放在哪里。
不得不关心这些事情通常是一种不好的做法。
Thread.currentThread().getContextClassLoader().getResourceAsStream("abc.properties");
答案 4 :(得分:5)
我不知道这是否适用于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?
答案 5 :(得分:1)
当我从Websphere 8.5更改为WebSphere Liberty时,我遇到了同样的问题。
我使用FileInputStream
而不是getResourceAsStream()
,因为由于某种原因,WebSphere Liberty无法在WEB-INF
文件夹中找到该文件。
脚本是:
FileInputStream fis = new FileInputStream(getServletContext().getRealPath("/")
+ "\WEBINF\properties\myProperties.properties")
注意: 我只使用这个脚本进行开发。
答案 6 :(得分:0)
我有类似的问题,我搜索了一段时间的解决方案: 字符串参数似乎区分大小写。因此,如果您的文件名是abc.TXT,但是您搜索abc.txt,eclipse会找到它 - 可执行的JAR文件赢了。