【Java压缩zip】以及【压缩异常问题】

一、Java压缩zip代码:

public static Boolean picListToZip(List<String> mognoList, String ftpPath, String zipName) {
        HashMap<Object, Object> hashMap = new HashMap<>();
        //链接
        JSch jsch = new JSch();
        Session session = null;
        ChannelSftp sftpChannel = null;
        try {
            session = jsch.getSession("用户名", "xxx.xxx.xxx.xxx", 端口号);
            session.setConfig("StrictHostKeyChecking", "no");//使用带私钥的JSch来FTP文件
            session.setPassword("密码");
            session.connect(30000);
            Channel channel = session.openChannel("sftp");
            channel.connect();
            sftpChannel = (ChannelSftp) channel;
            //链接成功
            ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipName));
            byte[] buff = new byte[1024];
            //添加文件源
            for (int i = 0; i < mognoList.size(); i++) {
                FSObject fsObject = (MongoDBUtil.getObject("mongo桶", mognoList.get(i))); //从mongoDB中获取文件信息
                InputStream is = fsObject.getInputstream();
                zos.putNextEntry(new ZipEntry(fsObject.getName()));//会在压缩文件中建立名字为zipName的文件夹中建立fsObject.getName()文件
                int len = 0;
                while ((len = is.read(buff)) > 0) {
                    zos.write(buff, 0, len);
                }
                zos.closeEntry();
                is.close();
            }
            zos.close();
            FileInputStream in = new FileInputStream(new File(zipName)); // 转换为输入流
            //切换到指定文件夹---线上操作
            if (sftpChannel.ls(ftpPath) == null) {
                log.info("如果文件夹不存在,则创建文件夹");
                sftpChannel.mkdir(ftpPath);
            }
            sftpChannel.cd(ftpPath);
            sftpChannel.put(in, zipName);
            log.info("一次结束");
            sftpChannel.exit();
        } catch (Exception e) {
            sftpChannel.exit();
            session.disconnect();
            e.printStackTrace();
            return false;
        }
        return true;
    }

二、使用时出现的异常问题:

java.util.zip.ZipException: duplicate entry: xxx文件
    at java.util.zip.ZipOutputStream.putNextEntry(ZipOutputStream.java:215)
出现这种错误的原因是:打包的过程中,出现相同的文件名称
 zos.putNextEntry(new ZipEntry(fsObject.getName()));//会在压缩文件中建立名字为zipName的文件夹中建立fsObject.getName()文件

参数 fsObject.getName() 存在相同的文件名称时,就会出现开头处的异常信息。

解决方法: 针对文件名做唯一处理,在原文件名的基础上加上UUID,避免文件名一致
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值