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

本文介绍如何使用Java的ZipFile和ZipEntry类从ZIP/JAR/WAR/EAR文件中加载特定资源的输入流。文章提供了具体的方法实现,并解释了资源路径的构造规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;

    }

 

方法含义很简单

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值