Class.getResourceAsStream()问题

时间:2009-01-22 14:12:09

标签: java

我有一个带有java类的JAR-archive。其中一个使用嵌入到同一JAR中的一些资源。为了加载我使用的资源

MyClass.class.getResourceAsStream(myResourceName);

困扰我的一件事是,是否保证从同一个JAR中加载所需的资源。 “getResourceAsStream()”方法(以及相应的ClassLoader方法)的文档对我来说并不是很清楚。

如果在我的JAR之前有一个同名资源位于JVM类路径中的某个位置,会发生什么?是否会加载该资源而不是我的JAR中嵌入的资源?有没有其他方法来替换JAR中嵌入的资源?

4 个答案:

答案 0 :(得分:2)

是。返回类路径上找到的第一个匹配资源,就像可执行搜索路径一样。这就是为什么资源通常被放置在镜像库或应用程序的包结构的目录中的“命名空间”。

在存在自定义类加载器时(例如在OSGi中),此行为可能略有不同,但对于vanilla Java应用程序,情况确实如此。

答案 1 :(得分:1)

它的工作方式与查找类文件的方式大致相同。所以首先尝试父类加载器(递归)然后执行类加载器实现所做的任何事情来查找文件。

没有检查直接调用者类加载器(如ResourceBundle所做的那样 - 请参阅Java Secure Coding Guidelines的第6.3节)。但是,您确实需要权限才能打开URL,因为ClassLoader.getResourceAsStream只需在默认实现中调用URL.openStream

答案 2 :(得分:1)

指定包裹。假设你使用com.yourcompany.file它应该是唯一的。 (除非有人想通过类路径覆盖你的配置文件。)

答案 3 :(得分:1)

如果您只想从特定的JAR读取文件,可以打开JarFile并直接读取它。