根据资源路径加载ZIP压缩包中指定的资源

来源:互联网 发布:mac word转pdf原页面 编辑:程序博客网 时间:2024/05/23 13:03

JAR、WAR、EAR、在文件结构上,三者并没有什么不同,它们都采用ZIP或JAR档案文件压缩格式。针对ZIP压缩文档中的类文件或者配置文件,如何根据该资源路径就能直接加载到其文件流呢? Java.util.zip包中的ZipFile类和ZipEntry类两者结合即可根据资源的路径加载到其对应的文件流。

    /**

     *GetInputStreambyzipentry 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方法中即将类的全限定名中“.”全部替换成“/”构成资源的路径。

    /**

     *Addapackagenameprefixif the nameisnotabsoluteRemoveleading“/”

     *ifnameisabsolute

     */

    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;

    }

 

方法含义很简单

  • 对于不是以“/”开头的参数,就认为这个路径是相对于当前类的路径,所以加载当前包中的资源只要写资源文件的名字就可以了。方法最大的一块代码就是为了得到当前类的路径,然后和传进来的相对路径参数拼起来,作为资源文件的绝对路径丢给CL。
  • 对于以“/”开头的参数,就认为参数是资源文件的绝对路径,将这个斜线去掉之后,丢给CL去加载就行了。

0 0
原创粉丝点击