Java 如何从不同的JAR读取多个同名资源文件?

Java 如何从不同的JAR读取多个同名资源文件?,java,classpath,Java,Classpath,如果类路径中有两个JAR文件,它们的根目录中都包含一个名为“config.properties”的资源。是否有类似于getClass().getResourceAsStream()的方法来检索这两个文件?这个命令与此无关 另一种方法是加载类路径中与某些标准匹配的每个属性文件(如果可能的话)。您需要 (或静态版本) 但不幸的是,不在“目录”中的资源存在一个已知问题。例如,foo/bar.txt很好,但是bar.txt可能是个问题。这是一个问题,尽管它决不是弹簧特有的问题 更新: List<I

如果类路径中有两个JAR文件,它们的根目录中都包含一个名为“config.properties”的资源。是否有类似于
getClass().getResourceAsStream()
的方法来检索这两个文件?这个命令与此无关

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

您需要
(或静态版本)

但不幸的是,不在“目录”中的资源存在一个已知问题。例如,
foo/bar.txt
很好,但是
bar.txt
可能是个问题。这是一个问题,尽管它决不是弹簧特有的问题

更新:

List<InputStream> resources = loadResources("config.properties", classLoader);
// or:
List<InputStream> resources = loadResources("config.properties", null);
下面是一个helper方法,它返回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;
}
公共静态列表加载资源(
最终字符串名称,最终类加载器(类加载器)引发IOException{
最终列表=新的ArrayList();
最终枚举系统资源=
(classLoader==null?classLoader.getSystemClassLoader():classLoader)
.getResources(名称);
while(systemResources.hasMoreElements()){
添加(systemResources.nextElement().openStream());
}
退货清单;
}
用法:

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

jar文件是zip文件

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

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


当你有了这个条目,你就可以用.getInputStream()获取它的流了。

这主意不错,但是我通常不知道代码中jar文件的位置和名称。@Mulmoth是的,你知道:System.getProperty(“java.class.path”)@Sean Patrick Floyd:不是所有的jar文件都在系统类路径上。例如,在Web应用程序中,它们来自各种各样的地方。@Thilo这当然是真的,不过,我想让他知道标准情景的方法很酷。谢谢您可以添加一个示例,说明如何处理该URL以获取InputStream吗?@Mulmoth:
URL
类有一个
openStream
方法,该方法返回该URL的InputStream。这应该就是你所需要的了,很好用。你救了我一天