English 中文(简体)
Class.getResourceAsStream()问题
原标题:
  • 时间:2009-01-22 14:12:09
  •  标签:

我有一个包含Java类的JAR存档文件。其中一个类使用了与该JAR存档文件一起嵌入的一些资源。为了加载该资源,我使用

MyClass.class.getResourceAsStream(myResourceName);

让我困扰的一件事情是是否有保证所需资源将从同一JAR中加载。我对“getResourceAsStream()”方法(以及相应的ClassLoader s方法)的文档并不十分清楚。

如果在我的JAR之前,JVM类路径中有一个同名的资源,会发生什么?那么那个资源会被加载,而不是嵌入在我的JAR中的资源吗?还有其他替代嵌入在JAR中的资源的方法吗?

问题回答

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

这种行为在存在自定义类加载器的情况下可能会略有不同(比如在OSGi中),但对于普通Java应用程序来说,它确实如此。

它的工作方式与查找类文件的方式类似。因此,首先尝试父类加载器(递归),然后执行类加载器实现执行的操作来查找文件。

没有对直接调用者类加载器进行检查(就像ResourceBundle一样 - 参见Java安全编码指南第6.3节)。然而,您需要权限打开URL,因为ClassLoader.getResourceAsStream在默认实现中只调用URL.openStream

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

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





相关问题
热门标签