getResourceAsStream() 总是返回 null [重复]
Posted
技术标签:
【中文标题】getResourceAsStream() 总是返回 null [重复]【英文标题】:getResourceAsStream() is always returning null [duplicate] 【发布时间】:2011-02-17 08:05:34 【问题描述】:我在 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");
但它总是返回一个空值。我需要从那个文件中读取,我读到如果你把文件放在WEB-INF
,你可以用getResourceAsStream
访问它们,但是这个方法总是返回一个null
。
对我可能做错了什么有任何想法吗?
顺便说一句,奇怪的是这可以工作,但是在我对项目执行Clean and Build
后,它突然停止工作:/
【问题讨论】:
【参考方案1】:据我所知,该文件必须位于 'this'
类所在的文件夹中,即不在 WEB-INF/classes
中,而是嵌套更深(除非您写入默认包):
net/domain/pkg1/MyClass.java
net/domain/pkg1/abc.txt
将文件放入您的 java 源代码应该可以工作,编译器将该文件与类文件一起复制。
【讨论】:
+1 干杯,伙计,它奏效了。我将文件移至wservices
,现在可以使用了
如果您使用的是 Eclipse,您还需要点击“F5”(刷新),以便您的“abc.txt”出现在包资源管理器中,否则 getResource() 始终返回 null。
我发现单元测试对文件在 Eclipse/maven 中的位置更加宽容,但是在打包和部署文件时,只有当我按照这个答案的建议移动它以匹配类的位置时,该文件才起作用。跨度>
【参考方案2】:
对Class#getResourceAsStream(String)
的调用代表类加载器,并在类路径中搜索资源。换句话说,您当前的代码将无法工作,您应该将abc.txt
放入WEB-INF/classes
,或者如果打包在一个jar 文件中,则放入WEB-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));
【讨论】:
但是有没有办法可以从我的 Web 服务调用getServletContext
?【参考方案3】:
代替
InputStream fstream = this.getClass().getResourceAsStream("abc.txt");
使用
InputStream fstream = this.getClass().getClassLoader().getResourceAsStream("abc.txt");
这样它会从根目录看,而不是从当前调用类的路径看
【讨论】:
伙计,我与空指针和 BOOM 战斗了 3 个小时,你的评论...thanx)【参考方案4】:我认为通过这种方式,您可以从“任何地方”(包括服务器位置)获取文件,而无需关心将文件放在哪里。
必须关心这些事情通常是一种不好的做法。
Thread.currentThread().getContextClassLoader().getResourceAsStream("abc.properties");
【讨论】:
很高兴我遇到了这个答案。非常感谢!绝对没有其他东西对我有用。【参考方案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?
【讨论】:
【参考方案6】:当我从 Websphere 8.5 更改为 WebSphere Liberty 时,我遇到了同样的问题。
我使用了FileInputStream
而不是getResourceAsStream()
,因为由于某种原因,WebSphere Liberty 无法在WEB-INF
文件夹中找到该文件。
脚本是:
FileInputStream fis = new FileInputStream(getServletContext().getRealPath("/")
+ "\WEBINF\properties\myProperties.properties")
注意: 我仅将此脚本用于开发。
【讨论】:
【参考方案7】:我遇到了类似的问题,我搜索了很长一段时间的解决方案: 字符串参数似乎区分大小写。因此,如果您的文件名是 abc.TXT 但您搜索 abc.txt,eclipse 会找到它 - 可执行 JAR 文件不会。
【讨论】:
以上是关于getResourceAsStream() 总是返回 null [重复]的主要内容,如果未能解决你的问题,请参考以下文章
为啥 isset($this->var) 在我的 Codeigniter 模型中总是返回 false?
Class.getResourceAsStream()和ClassLoader.getResourceAsStream()
Class.getResourceAsStream()与ClassLoader.getResourceAsStream()的区别
JAVA 笔记 ClassLoader.getResourceAsStream() 与 Class.getResourceAsStream()的区别
Class.getResourceAsStream和ClassLoader.getResourceAsStream方法
ClassLoader.getResourceAsStream() 与 Class.getResourceAsStream()的区别