鉴于此代码:
/* 1 */ InputStream in1 = ClassLoader.getSystemResourceAsStream("foobar.txt");
/* 2 */ InputStream in2 = this.getClass().getResourceAsStream("/foobar.txt");
两者都返回相同的资源(我认为答案是“是”)?
他们都访问“相同”的类路径吗?为什么#1中的方法名称“获取系统 ResourceAsStream”,但对于#2,它只是“getResourceAsStream”?
由于
答案 0 :(得分:11)
关键区别在于类加载器。
以下使用System ClassLoader
ClassLoader.getSystemResourceAsStream("foobar.txt");
虽然这个使用getClass()
返回的类加载器
this.getClass().getResourceAsStream("/foobar.txt");
换句话说,两个语句的行为是否完全相同,取决于应用程序类加载器。对于简单的应用程序,两者都引用相同的类加载器。但是,对于大多数应用程序(如在Servlet容器中运行的Web应用程序),情况并非如此。
一般来说,我会说getClass()。getResourceAsStream()将是更好的选择,因为它将使用与代码所属的类相同的类加载器。
答案 1 :(得分:7)
根据javadoc
打开以供阅读,搜索中指定名称的资源 用于加载类的路径。此方法通过查找资源 系统类加载器(参见getSystemClassLoader())。
用于加载this
的类加载器不一定是系统类加载器。在一个简单的桌面应用程序中,这可能是真的。但是webapps - 除其他外 - 通常具有更复杂的类路径层次结构,因此不一定相同。因此,在复杂的类路径中,返回的内容还将取决于在类路径中浮动的“foobar.txt”副本数量。
简短的回答是你不能假设他们会为同一资源返回一个流。