【发布时间】:2011-10-07 12:26:06
【问题描述】:
如果类路径中有两个 JAR 文件,它们的根目录中都包含一个名为“config.properties”的资源。有没有办法检索类似于getClass().getResourceAsStream() 的两个 文件?顺序不相关。
如果可能的话,另一种方法是加载类路径中符合某些条件的每个属性文件。
【问题讨论】:
如果类路径中有两个 JAR 文件,它们的根目录中都包含一个名为“config.properties”的资源。有没有办法检索类似于getClass().getResourceAsStream() 的两个 文件?顺序不相关。
如果可能的话,另一种方法是加载类路径中符合某些条件的每个属性文件。
【问题讨论】:
你需要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 类有一个 openStream 方法,该方法返回该 URL 的 InputStream。这应该就是你所需要的。
jar 文件是 zip 文件。
使用 java.util.zip.ZipFile 打开文件
然后枚举其条目以查找所需的属性文件。
当你有条目时,你可以使用 .getInputStream() 获取它的流
【讨论】: