【Java】导出的压缩文件名重复则在后面叠加(数字)

1、场景

db 里边存了一堆允许重名的文档,需要导出,且自动给重名的文档叠加数字尾缀。比如有文档名字分别是【全国富婆通讯录】、【全国富婆通讯录】、【全国富婆通讯录(1)】…你就不要问为什么要上传重名文档到 db 了,甚至还有已经带了尾缀的文档(可能富婆的世界就是这么奇妙吧*!@##%^&…)
那么生成 doc 塞进 zip 时就会异常:
java.util.zip.ZipException: duplicate entry

2、主旨

导出文件(略),需要 导出 doc /并且压缩成 zip /并且数据源于富文本 请参考 Java 富文本 导出 word 压缩包, 本篇主要讲导出的文件名重名处理。

3、思路

用 Hashmap 对文件名字去重并存储叠加数字。

4、代码

1)先有一个实体类 RichWoman.java

public class RichWoman {
    String name = "";
    String content = "";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

2)再有一个叠加命名类 TestHashmap.java

import java.util.*;

public class TestHashmap {
    public static void main(String[] args) {
        List<RichWoman> dataList = new ArrayList<RichWoman>();
        RichWoman data = new RichWoman();
        data.setName("全国富婆通讯录");
        data.setContent("111111");
        dataList.add(data);

        data = new RichWoman();
        data.setName("全国富婆通讯录");
        data.setContent("222222");
        dataList.add(data);

        data = new RichWoman();
        data.setName("全国富婆通讯录");
        data.setContent("333333");
        dataList.add(data);

        data = new RichWoman();
        data.setName("全国富婆通讯录(1)");
        data.setContent("444444");
        dataList.add(data);

        data = new RichWoman();
        data.setName("全国富婆通讯录(1)");
        data.setContent("555555");
        dataList.add(data);

        data = new RichWoman();
        data.setName("全国富婆通讯录(1)");
        data.setContent("666666");
        dataList.add(data);

        //定义一个map, key 为名字,value 为doc尾缀的叠加数字
        Map<String, Integer> nameMap = new HashMap<String, Integer>();
        for (RichWoman param : dataList){
            //用 HashMap 的去重先给所有名字的叠加数字置0(因为名字首次出现时不需要加尾缀)
            nameMap.put(param.getName(), 0);
        }
        for (RichWoman param : dataList){
            String name = param.getName();
            int count = nameMap.get(name);
            String docName = "";
            if (nameMap.containsKey(name)){
                if (count > 0){
                    docName = name + "(" + count + ")";
                    //如果已经包含,说明有自带尾缀的文件名占坑了,那就再叠加1
                    if (nameMap.containsKey(docName)){
                        count++;
                        docName = name + "(" + count + ")";
                    }
                }else {
                    docName = name;
                }
            }else {
                docName = name;
            }
            count++;
            nameMap.put(name, count);
            System.out.println(docName + ".doc" + "-------" + param.getContent());
        }
    }
}

3)运行效果
在这里插入图片描述

以上。如果有更优雅的办法欢迎留言讨论喔。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Java导出Excel文件名出现乱码的问题可以通过设置`Content-disposition`的header来解决。其,使用`URLEncoder.encode`方法将文件名进行编码,再将编码后的文件名设置到header。例如,在SSM框架下可以这样处理:所示的`exportXls`方法。这个方法使用了AutoPoi库来导出Excel文件,并且可以设置导出文件名和其他参数。 总结来说,要解决Java导出Excel文件名乱码的问题,可以根据浏览器类型选择适合的文件名编码方式,或者使用工具类来简化导出操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [java项目poi插件导出Excel文件名文乱码](https://blog.csdn.net/weixin_42129270/article/details/121425098)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Java导出Excel表格文件名乱码问题](https://blog.csdn.net/m0_49790240/article/details/127434593)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值