getResourceAsStream()地狱

有人可以解释我.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和URI一样的架构类路径:

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

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

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

而且你可能没有路径包含. 或者..就像你对文件系统路径一样。

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

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

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

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

您必须了解它与类路径有关

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

javadocs也很有说服力。