【问题标题】:How to read several resource files with the same name from different JARs?如何从不同的 JAR 中读取多个同名的资源文件?
【发布时间】:2011-10-07 12:26:06
【问题描述】:

如果类路径中有两个 JAR 文件,它们的根目录中都包含一个名为“config.properties”的资源。有没有办法检索类似于getClass().getResourceAsStream()两个 文件?顺序不相关。

如果可能的话,另一种方法是加载类路径中符合某些条件的每个属性文件。

【问题讨论】:

    标签: java classpath


    【解决方案1】:

    你需要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);
    

    【讨论】:

    • 酷。谢谢!您能否添加一个示例如何继续使用该 URL 来获取 InputStream?
    • @Mulmoth:URL 类有一个 openStream 方法,该方法返回该 URL 的 InputStream。这应该就是你所需要的。
    • 工作正常。你刚刚拯救了我的一天
    【解决方案2】:

    jar 文件是 zip 文件。

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

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

    当你有条目时,你可以使用 .getInputStream() 获取它的流

    【讨论】:

    • 好主意,但我通常不知道代码中 jar 文件的位置和名称。
    • @Mulmoth 是的,你这样做:System.getProperty("java.class.path")
    • @Sean Patrick Floyd:并非所有 JAR 文件都在 System 类路径上。例如,在 Web 应用程序中,它们来自各个地方。
    • @Thilo 这当然是对的,不过我还是想让他知道标准情况下的方法
    猜你喜欢
    • 2014-01-30
    • 2013-12-08
    • 2021-11-21
    相关资源
    最近更新 更多