【问题标题】:getResourceAsStream() hellgetResourceAsStream() 地狱
【发布时间】:2015-10-01 20:01:55
【问题描述】:

谁能解释一下 .getResourceAsStream() 是如何工作的。我试图找出痛苦的事实,在某些情况下 getClass().getResourceAsStream(name);在 Eclipse 中可以正常工作,但在已部署版本(NPE)中不能正常工作。我面临的另一个事实是,有时 getClass().getResource(name);返回一个完全有效的 url 但 getClass().getResourceAsStream(name);返回空值。是否有人编写了一个库,我只需传递包(路径)和文件名并接收流而无需唠叨?

编辑:这是一个普遍的东西,每次我必须使用 getResourceAsStream() 时都会影响到我。是的,我可以提供一个针对实际情况截取的代码,但这对我下一次没有帮助,直到我不明白 getResourceAsStream 是如何工作的。

编辑2:和有什么区别:

MyClass.class.getResourceAsStream(...)
this.getClass().getResourceAsStream(...),    
MyClass.class.getClassLoader().getResourceAsStream(...)
Thread.currentThread().getContextClassLoader().getResourceAsStream(...)

编辑 3: 此外,虽然some.package.SomeClass.class.getResourceAsStream("/path/only/holding/resource.files") 无法在不包含类而只包含文件的类路径中加载资源。这个变体能够做到这一点:ClassLoader.class.getResourceAsStream("/path/only/holding/resource.files") 这让我很困惑,所以我真的更喜欢 spring 对 URI 模式类路径所做的事情:

【问题讨论】:

  • 提供代码并最好提供您的 jar/war 的内容,通过 zipinfo 提供。

标签: java resources


【解决方案1】:

规则很简单。假设您的课程在包com.foo 中。

在此类上调用getResource("bar/bla.txt")(没有前导/)将在包com.foo.bar 中的bla.txt 中查找文件。因此,路径是相对于类的包的。类路径用于查找文件,就像类路径用于查找类一样。

在此类上调用getResource("/bar/bla.txt")(前导/)将在包bar 中的bla.txt 中查找文件。因此,路径是绝对路径,从类路径的根开始。类路径用于查找文件,就像类路径用于查找类一样。

您可能没有像文件系统路径那样包含... 的路径。

【讨论】:

  • 这是否适用于以下任何变量:MyClass.class.getResourceAsStream(...), this.getClass().getResourceAsStream(...), MyClass.class.getClassLoader().getResourceAsStream( ...)?
  • 一个类就是一个类。无论您以何种方式获取该类的实例,它的方法都会做同样的事情。
【解决方案2】:

当您要搜索的资源在类的同一个 jar 中时,性能会更好。

例如:mypackagenumber1.jar/xsl/test.xsl 和 mypackagenumber1.jar/com.foo/TestGetResourceAsStream("/xsl/test.xsl") 中的类;

当项目有非常包的jar时,当打包资源在不同的jar中时,我遇到了性能问题。

Ex:mypackagenumber1.jar/xsl/test.xsl 和中的类 mypackagenumber42.jar/com.foo/TestGetResourceAsStream("/xsl/test.xsl");

【讨论】:

    【解决方案3】:

    您必须了解它与 类路径 相关。

    如果您在 Eclipse 上运行时与作为部署版本运行时具有不同的类路径,您可以获得不同的结果。

    javadocs 也很好解释。

    【讨论】:

      猜你喜欢
      • 2016-05-29
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      相关资源
      最近更新 更多