自己写的一个基于Java的文件重命名的小方法

起因

今天在做网页后台的时候需要一种情况:在单次文件上传的时候需要检测该文件名是否已经存在的情况。如果没有存在就正常存,如果存在同名的话就要进行重命名。
比如说上传一个1.txt,数据表中用文件全名和另一个数据定位是否在对应路径下有同名文件。如果没有,就存入1.txt。如果有,则重命名为1(1).txt,再进行验证,如果1(1).txt也有,则重命名为1(3).txt再验证,直到不重名为止。

思路

1.首先要做的,是验证这个名字是否重名。这点结合实际开发环境,比如我的项目就是用课程Id和文件全名进行验证。
2.如果重复,这时就进入方法,将文件名分开(基本名和后缀名),给基础名加一个“(1)”,重新组合,这时文件名就成了基础名(1).后缀
3.接下来该做的自然是继续验证这个带了(1)的文件名是否重复,如果重复则将(1)中的数字替换成2、3、4……直到不重复。
4.这种一直重复到结束无疑需要使用递归方法。
5.递归方法,需要传的参数从上文来看有三个:文件名和课程Id,用于验证是否重复;循环次数,一是用于作为锚点,二是作为括号中的数。

代码

public String rewriteLessonFileName(String fileName, Integer lessonId, Integer times){
        String newFileName = null;
        //验证该路径下是否存在同名文件
        if(lessonFileService.findSameNameLessonFile(fileName,lessonId)){//返回true,存在同名
            String basename = FilenameUtils.getBaseName(fileName);//获取基础名
            String extension = FilenameUtils.getExtension(fileName);//获取后缀名
            //如果文件名为1.txt这种情况,需要重命名为1(1).txt
            //如果文件名为1(1).txt这种情况,需要命名为1(2).txt
            if(times == 1){//第一次来就加(1)
                String newname = basename+"("+times+")"+"."+extension;
                newFileName = rewriteLessonFileName(newname, lessonId, times+1);
            }else{//第二次以及以后就把(数字)换成(times)
                StringBuilder stringBuilder = new StringBuilder(basename);
                stringBuilder.replace(basename.length()-2,basename.length()-1,times.toString());
                String newBaseName = stringBuilder.toString();
                String newname = newBaseName+"."+extension;
                newFileName = rewriteLessonFileName(newname, lessonId, times+1);
            }
        }else{
            newFileName = fileName;
        }
        return newFileName;
    }

注意

1.String类中没有替换指定位置字符的方法,因此使用StringBuilder类。
2.StringBuilder类中的替换方法是取左不取右,从字符串的0开始。比如对字符串1(1):
字符串1(1),长4位,各位置如图我要做的是替换掉括号中的数字,既是第2位。因此要替换的是第2位,但不替换第3位,因为第三位的后括号要保留。
因此使用

stringBuilder.replace(2,3,2);

将括号中的1替换成2。这里的取值范围就相当于[2,3)。
3.结合项目,将替换范围从确定的数换成长度倒减,我要替换的倒数第二位,因此取值范围是字符串长度-2到字符串长度-1

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值