有人可以解释一下.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的架构类路径:
答案 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也很有说服力。