JAVA多级目录的文件压缩


```java
/**
     * 递归压缩方法
     * @author ouxd
     * @param bytes 这个参数为map<string,object>,object可以为map和byte[]两种类型,可以循环创建,string为文件名,包含文件后缀,可以传空,则会少一层文件夹
     * @param name 调用的时候传空字符串,如果不为空,则会多一层文件目录
     *
     * */
    public static void compressByByteArr(Object bytes, ZipOutputStream zos, String name) throws Exception {
        ByteArrayInputStream bais = null;
        int temp = 0;
        if (bytes instanceof byte[]) {
            byte[] buf = new byte[2*1024];
            byte[] fileBytes = (byte[]) bytes;
            bais = new ByteArrayInputStream(fileBytes);
            //3.2设置ZipEntry对象,并对需要压缩的文件命名
            zos.putNextEntry(new ZipEntry(name));
            //3.3读取要压缩的字节输出流,进行压缩
            while ((temp = bais.read(buf)) != -1) {
//                zos.write(temp);    // 压缩输出
                zos.write(buf, 0, temp);
            }
            zos.closeEntry();
        } else {
            //如果为map的话,则递归调用
            Map object1 = (Map) bytes;
            Set keySet = object1.keySet();
            for (Object o : keySet) {
                String localName =null;
                if ("".equals(name)) {
                    localName= o.toString();
                }else {
                    localName=name+"/"+o.toString();
                }
                compressByByteArr(object1.get(o), zos, localName);
            }
        }
    }

```java

```java
public static void main(String[] args) throws Exception {
        /** 测试压缩方法 简单的测试 */
        Map<String, Object> byteMap = new HashMap<>();
        // 第1步、使用File类找到一个文件
        File f = new File("F:\\template\\001\\test1.txt");    // 声明File对象

        InputStream input = null;    // 准备好一个输入的对象
        input = new FileInputStream(f);    // 通过对象多态性,进行实例化
        // 第3步、进行读操作
        byte result[] = new byte[Integer.valueOf(f.length() + "")];        // 所有的内容都读到此数组之中
        input.read(result);        // 读取内容   网络编程中 read 方法会阻塞
        // 第4步、关闭输出流
        input.close();                        // 关闭输出流
        File f2 = new File("F:\\template\\001\\test2.txt");    // 声明File对象
        // 第2步、通过子类实例化父类对象
        input = new FileInputStream(f2);    // 通过对象多态性,进行实例化
        // 第3步、进行读操作
        byte result2[] = new byte[Integer.valueOf(f2.length() + "")];        // 所有的内容都读到此数组之中
        input.read(result2);        // 读取内容
        // 第4步、关闭输出流
        input.close();                        // 关闭输出流

        File f4 = new File("F:\\template\\test.xlsx");    // 声明File对象
        // 第2步、通过子类实例化父类对象
        input = new FileInputStream(f4);    // 通过对象多态性,进行实例化
        // 第3步、进行读操作
        byte result4[] = new byte[Integer.valueOf(f4.length() + "")];        // 所有的内容都读到此数组之中
        input.read(result4);        // 读取内容
        // 第4步、关闭输出流
        input.close();                        // 关闭输出流

        Map fileAndDic = new HashMap();
        //加入文件
        fileAndDic.put("test1.txt", result);
        fileAndDic.put("text2.txt", result2);

        //这个文件放在文件夹下
        Map fileMap = new HashMap();
        fileMap.put("test.xlsx", result4);
        //加入文件夹
        fileAndDic.put("文件夹", fileMap);
        //map的结构就是文件夹的结构,如果有后缀的则是文件,没有后缀的为生成文件夹
        //
        byteMap.put("001", fileAndDic);
        //1.创建字节数组输出流,用于返回压缩后的输出流字节数组
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        //2.创建压缩输出流
        ZipOutputStream zipOut = new ZipOutputStream(baos);
        long startTime = System.currentTimeMillis();
        ZipUtils.compressByByteArr(byteMap, zipOut, "");
        zipOut.close();
        long endTime = System.currentTimeMillis();
        System.out.println(endTime - startTime);
        File file = new File("F:\\template" + "\\" + "测试多文件目录压缩.zip");
        byte[] toByteArray = baos.toByteArray();
        OutputStream os = new FileOutputStream(file);
        os.write(toByteArray);
        os.close();
        baos.close();
        /** 测试压缩方法2  */
    }
![最上级目录](https://img-blog.csdnimg.cn/20200304105542611.png)
![在001文件夹下](https://img-blog.csdnimg.cn/20200304105555534.png)
![在文件夹目录下的文件,对应Map的结构](https://img-blog.csdnimg.cn/2020030410560741.png)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值