java--对zip递归组装层级结构

一、效果与主要工具

先展示实现效果如下:

其中使用vue的 tree控件

<el-tree :data="data" :props="defaultProps" @node-click="handleNodeClick"></el-tree>

 JAVA中使用的  java.util.zip

二、实现代码

具体代码如下,主要为入口和递归方法组成 传入的是zip的file流

    public static JSONArray getZipTreeChild(InputStream ins) throws Exception {
        JSONArray result = new JSONArray();
        ZipInputStream zin = new ZipInputStream(ins, Charset.forName("GBK"));
        try {
            ZipEntry ze = zin.getNextEntry();
            if(ze == null) throw new RuntimeException("读取压缩包失败");
            getZipTreeUtil(ze,zin,result,"");
        }catch (Exception e){
            throw new RuntimeException(e.toString());
        }finally {
            zin.close();
        }
        return result;
    }

    public static ZipEntry getZipTreeUtil(ZipEntry ze,ZipInputStream zin,JSONArray arr,String parentName)throws Exception{
        while (ze != null) {
            boolean isbrother = false;
            ZipEntry beforeze = null;
            JSONObject zipFile = new JSONObject();
            if (ze.isDirectory()) {
                if(!ze.getName().contains(parentName)){
                    //回退一格
                    return ze;
                }
                JSONArray child = new JSONArray();
                String zeName = ze.getName();
                String cutZeName =  zeName.substring(0,zeName.lastIndexOf("/"));
                zipFile.put("label",cutZeName.substring(cutZeName.lastIndexOf("/")+1));
                zipFile.put("children",child);
                arr.add(zipFile);
                ze = zin.getNextEntry();
                beforeze = getZipTreeUtil(ze,zin, child,zeName);
                ze = beforeze;
            } else {
                if(!ze.getName().contains(parentName)){
                    //不属于此文件夹的文件退出一层文件夹
                    return ze;
                }
                beforeze = null;
                zipFile.put("label", ze.getName().substring(ze.getName().lastIndexOf("/")+1)+"["+fileconver(ze.getSize()/1000)+"]");
                arr.add(zipFile);
            }
            if(beforeze == null) ze = zin.getNextEntry();
        }
        return null;
    }

    /**
     * 测试用例
     *
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        try {
            File file  = new File("D:\\Project\\mycat\\1.20可运行.zip");
            InputStream ins = new FileInputStream(file);
            JSONArray aa = getZipTreeChild(ins);
            System.out.println(aa.toString());
        }catch (Exception e){

        }
    }

供有需求的朋友使用,也请指出可优化部分,总感觉写复杂了

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值