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

42

如果classpath中有两个JAR文件,它们的根目录都包含了一个名为“config.properties”的资源文件。是否有一种类似于getClass().getResourceAsStream()的方法可以获取这两个文件?顺序不重要。

另一个选择是加载符合特定条件的类路径中的每个属性文件,如果可能的话。

2个回答

37

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

但是不幸的是,对于不在“目录”中的资源存在已知问题。例如,foo/bar.txt没有问题,但是bar.txt可能存在问题。这在Spring参考文档中有很好的描述,尽管这绝不是Spring特有的问题。

更新:

这里有一个帮助方法,可以返回InputStream列表:

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);

好的。谢谢!您能否添加一个例子来说明如何通过这些URL获得InputStream? - Zeemee
2
@Mulmoth:URL类有一个openStream方法,该方法返回该URL的InputStream。这应该是你所需要的全部内容。 - Luke Woodward
运行良好。你刚刚救了我的一天。 - Prabhath Suminda

0

jar文件是zip文件。

使用java.util.zip.ZipFile打开文件。

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

当您获得条目时,可以使用.getInputStream()获取其流。


2
不错的想法,但我通常不知道代码中的jar文件的位置和名称。 - Zeemee
3
@Mulmoth 是的,你需要:System.getProperty("java.class.path") - Sean Patrick Floyd
1
@Sean Patrick Floyd:并非所有的JAR文件都在系统类路径上。例如,在Web应用程序中,它们来自各种地方。 - Thilo
@Thilo 当然是对的,不过我还是想让他了解一下标准情况下的方法。 - Sean Patrick Floyd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接