代码之家  ›  专栏  ›  技术社区  ›  Andreas Grech

getResourceAsstream()始终返回null[duplicate]

  •  40
  • Andreas Grech  · 技术社区  · 15 年前

    在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 在这个项目上,它突然停止了工作:/

    7 回复  |  直到 15 年前
        1
  •  38
  •   Esteban Herrera    10 年前

    据我所知,文件必须在 'this' 类驻留,即不在 WEB-INF/classes 但嵌套得更深(除非您在默认包中编写):

    net/domain/pkg1/MyClass.java  
    net/domain/pkg1/abc.txt
    

    将文件放入Java源应该工作,编译器将文件复制到类文件中。

        2
  •  28
  •   Pascal Thivent    15 年前

    打电话给 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));
    
        3
  •  14
  •   Derlin    8 年前

    而不是

    InputStream fstream = this.getClass().getResourceAsStream("abc.txt"); 
    

    使用

    InputStream fstream = this.getClass().getClassLoader().getResourceAsStream("abc.txt");
    

    这样,它将从根目录而不是当前调用类的路径来查看

        4
  •  7
  •   oberfreak    11 年前

    我认为这样你就可以从“任何地方”(包括服务器位置)获取文件,而不需要关心放在哪里。

    关心这些事情通常是一种不好的做法。

    Thread.currentThread().getContextClassLoader().getResourceAsStream("abc.properties");
    
        5
  •  5
  •   Community Mohan Dere    8 年前

    我不知道这是否适用于jax-ws,但对于jax-rs,我可以通过注入servletcontext然后对其调用getresourceasstream()来访问文件:

    @Context ServletContext servletContext;
    ...
    InputStream is = servletContext.getResourceAsStream("/WEB-INF/test_model.js");
    

    注意,至少在GlassFish3.1中,路径必须是绝对的,即从斜线开始。更多信息: How do I use a properties file with jax-rs?

        6
  •  1
  •   CupawnTae    10 年前

    当我从websphere 8.5更改为websphere liberty时,我遇到了同样的问题。

    我利用了 FileInputStream 而不是 getResourceAsStream() ,因为出于某种原因,websphere liberty无法在 WEB-INF 文件夹。

    剧本是:

    FileInputStream fis = new FileInputStream(getServletContext().getRealPath("/") 
                            + "\WEBINF\properties\myProperties.properties")
    

    注: 我用这个脚本只是为了开发。

        7
  •  0
  •   Dominik Maresch    9 年前

    我也遇到过类似的问题,我找了好一阵子解决办法: 字符串参数似乎区分大小写。因此,如果您的文件名是abc.txt,但是您搜索abc.txt,eclipse会找到它-可执行的jar文件不会。