如何演练 Java 类资源?

2022-09-03 02:05:00

我知道我们可以做这样的事情:

Class.class.getResourceAsStream("/com/youcompany/yourapp/module/someresource.conf")

以读取打包在我们的 jar 文件中的文件。

我已经用谷歌搜索了很多,我肯定没有使用正确的术语;我想做的是列出可用的资源,如下所示:

Class.class.listResources("/com/yourcompany/yourapp")

这应该返回包中的资源列表com.yourcompany.yourapp.*

这可能吗?关于如何做到这一点的任何想法,以防万一它不能像我展示的那样容易地完成?

注意:我知道有可能知道你的罐子在哪里,然后打开它并检查它的内容以实现它。但是,在我现在工作的环境中,我不能这样做。


答案 1

对于 JAR 文件中的资源,如下所示:

URL url = MyClass.class.getResource("MyClass.class");
String scheme = url.getProtocol();
if (!"jar".equals(scheme))
  throw new IllegalArgumentException("Unsupported scheme: " + scheme);
JarURLConnection con = (JarURLConnection) url.openConnection();
JarFile archive = con.getJarFile();
/* Search for the entries you care about. */
Enumeration<JarEntry> entries = archive.entries();
while (entries.hasMoreElements()) {
  JarEntry entry = entries.nextElement();
  if (entry.getName().startsWith("com/y/app/")) {
    ...
  }
}

您可以对文件系统或许多其他存储库中的“爆炸式”资源执行相同的操作,但这并不容易。您需要为要支持的每个 URL 方案提供特定的代码。


答案 2

通常无法获得这样的资源列表。一些类加载器甚至可能不支持这一点 - 想象一个类加载器可以从Web服务器获取单个文件,但Web服务器不必支持列出目录的内容。对于 jar 文件,当然,您可以显式加载 jar 文件的内容。

(顺便说一句,这个问题是相似的。


推荐