java getResourceAsStream()地狱
谁能告诉我怎么做吗。getResourceAsStream()真的很有效。我试图找出痛苦的事实,在某些情况下是getClass()。getResourceAsStream(名称);在eclipse中可以正常工作,但在部署版本(NPE)中不行。我面临的另一个事实是,有时getClass()。getResource(名称);返回完全有效的url,但getClass()。getResourceAsStream(名称);返回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对模式类路径URI所做的事情:
# 1 楼答案
规则很简单。假设您的类在包
com.foo
中在此类上调用
getResource("bar/bla.txt")
(无前导/
)将在包com.foo.bar
中的bla.txt
中查找文件。因此,路径是相对于类的包的。类路径用于查找文件,就像类路径用于查找类一样在此类上调用
getResource("/bar/bla.txt")
(前导/
)将在包bar
中的bla.txt
中查找文件。因此,路径是一条绝对路径,从类路径的根开始。类路径用于查找文件,就像类路径用于查找类一样而且您可能没有像文件系统路径那样包含
.
或..
的路径# 2 楼答案
当您搜索的资源位于类的同一个jar中时,性能会更好
例:我的手机号码1。jar/xsl/test。xsl和MyPackageUnber1中的类。jar/com。foo/TestGetResourceAsStream(“/xsl/test.xsl”)
当将资源打包到不同的jar中时,当项目有非常多的jar包时,我遇到了性能问题
例:我的手机号码1。jar/xsl/test。xsl和中的类 我的手机号码是42。jar/com。foo/TestGetResourceAsStream(“/xsl/test.xsl”)
# 3 楼答案
您必须了解,它与类路径相关
如果在eclipse上运行时与作为部署版本运行时有不同的类路径,则可以得到不同的结果
javadocs也很有解释性