getResourceAsStream()地狱

时间:2014-04-13 10:21:05

标签: java resources

有人可以解释一下.getResourceAsStream()是如何工作的。我试图弄清楚痛苦的事实,在某些情况下getClass()。getResourceAsStream(name);将在eclipse中正常工作,但在部署版本(NPE)中不会。我面临的另一个事实是,有时候getClass()。getResource(name);返回一个完全有效的url但getClass()。getResourceAsStream(name);返回null。有人写了一个库,我只是传递包(路径)和文件名并接收流而没有唠叨吗?

编辑:这是一般性的,每次我必须使用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的架构类路径:

3 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:0)

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

Ex: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”);

答案 2 :(得分:-1)

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

如果在eclipse上运行时有不同的类路径,而不是在作为已部署版本运行时,则可以获得不同的结果。

javadocs也很有说服力。