繁体   English   中英

ClassLoader.getSystemResourceAsStream和getClass()之间的区别.getResourceAsStream()

[英]Difference between ClassLoader.getSystemResourceAsStream and getClass().getResourceAsStream()

鉴于此代码:

/* 1 */ InputStream in1 = ClassLoader.getSystemResourceAsStream("foobar.txt");
/* 2 */ InputStream in2 = this.getClass().getResourceAsStream("/foobar.txt");

两者都返回相同的资源(我认为答案是“是”)?

他们都访问“相同”的类路径吗? 为什么#1中的方法名称“获取System ResourceAsStream”,但对于#2,它只是“getResourceAsStream”?

谢谢

关键的区别是类加载器。

以下使用System ClassLoader
ClassLoader.getSystemResourceAsStream("foobar.txt");

虽然这个使用getClass()返回的getClass()
this.getClass().getResourceAsStream("/foobar.txt");

换句话说,两个语句的行为是否完全相同,取决​​于应用程序类加载器。 对于简单的应用程序,两者都引用相同的类加载器。 但是,对于大多数应用程序(如在Servlet容器中运行的Web应用程序),情况并非如此。

一般来说,我会说getClass()。getResourceAsStream()将是更好的选择,因为它将使用与代码所属的类相同的类加载器。

根据javadoc

打开以便从用于加载类的搜索路径中读取指定名称的资源。 此方法通过系统类加载器查找资源(请参阅getSystemClassLoader() )。

用于加载this的类加载器不一定是系统类加载器。 在一个简单的桌面应用程序中,这可能是真的。 但是webapps - 除其他外 - 通常具有更复杂的类路径层次结构,因此不一定相同。 因此,在复杂的类路径中,返回的内容还将取决于在类路径中浮动的“foobar.txt”副本数量。

简短的回答是,您不能假设他们将返回相同资源的流。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM