JAR、WAR、EAR、在文件结构上,三者并没有什么不同,它们都采用ZIP或JAR档案文件压缩格式。针对ZIP压缩文档中的类文件或者配置文件,如何根据该资源路径就能直接加载到其文件流呢? java.util.zip包中的ZipFile类和ZipEntry类两者结合即可根据资源的路径加载到其对应的文件流。
/**
*GetInputStreambyzip entry name from specifiedjarfile.
*/
public InputStream getInputStreamFromEntry(String jarFile, String entryName) {
ZipFile zf = new ZipFile(jarFile);
ZipEntry ze = zf.getEntry(entryName);
return zf.getInputStream(ze);
}
注意,用来确定每个资源的名字是压缩文档中资源的实际路径名,而不是包(package)中类的名字。也就是说,java.util.zip包中的ZipEntry类的名字应为“java/util/zip/ZipEntry”,而不是"java.util.zip.ZipEntry"。事实上,Class类中的getResourceAsStream方法中即将类的全限定名中“.”全部替换成“/”构成资源的路径。
/**
*Addapackagename prefixif the nameis notabsoluteRemoveleading"/"
*ifnameis absolute
*/
private StringresolveName(String name) {
if (name ==null) {
return name;
}
if (!name.startsWith("/")) {
Class c = this;
while (c.isArray()) {
c = c.getComponentType();
}
String baseName = c.getName();
int index = baseName.lastIndexOf('.');
if (index != -1) {
name = baseName.substring(0, index).replace('.','/')
+"/"+name;
}
} else {
name = name.substring(1);
}
return name;
}
方法含义很简单