如何遍历Java类资源?


问题内容

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

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

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

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

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

那应该返回包内的资源列表 com.yourcompany.yourapp.*

那可能吗?关于如何做的任何想法,以防无法像我展示的那样容易地完成?

注意:我知道有可能知​​道您的罐子在哪里,然后将其打开并检查其内容以达到目的。但是,我无法在现在工作的环境中做到这一点。


问题答案:

对于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方案指定特定的代码。