如何从不同的JAR中读取多个具有相同名称的资源文件?

时间:2011-07-18 08:58:05

标签: java classpath

如果类路径中有两个JAR文件,则两个JAR文件的根目录中都包含名为“config.properties”的资源。有没有办法检索与getClass().getResourceAsStream()类似的两个文件?订单无关紧要。

另一种方法是在类路径中加载匹配某些标准的每个属性文件(如果可能的话)。

2 个答案:

答案 0 :(得分:27)

您需要ClassLoader.getResources(name)
(或静态版本ClassLoader.getSystemResources(name))。

但不幸的是,资源不存在于“目录”中,这是一个已知问题。例如。 foo/bar.txt很好,但bar.txt可能是个问题。这是described well in the Spring Reference,虽然它绝不是特定于Spring的问题。

<强>更新

这是一个返回InputStreams列表的辅助方法:

public static List<InputStream> loadResources(
        final String name, final ClassLoader classLoader) throws IOException {
    final List<InputStream> list = new ArrayList<InputStream>();
    final Enumeration<URL> systemResources = 
            (classLoader == null ? ClassLoader.getSystemClassLoader() : classLoader)
            .getResources(name);
    while (systemResources.hasMoreElements()) {
        list.add(systemResources.nextElement().openStream());
    }
    return list;
}

<强>用法:

List<InputStream> resources = loadResources("config.properties", classLoader);
// or:
List<InputStream> resources = loadResources("config.properties", null);

答案 1 :(得分:0)

jar文件是zip文件。

使用java.util.zip.ZipFile

打开文件

然后枚举其条目以查找所需的属性文件。

当您有条目时,您可以使用.getInputStream()

获取其流