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()的区别