【问题标题】:getResourceAsStream() is always returning null [duplicate]getResourceAsStream() 总是返回 null [重复]
【发布时间】: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 后,它突然停止工作:/

【问题讨论】:

    标签: java web-services jboss inputstream


    【解决方案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 文件不会。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-19
          • 1970-01-01
          • 2021-01-09
          • 2019-08-05
          • 1970-01-01
          相关资源
          最近更新 更多