【Java】按时间戳+随机数+用户ID+原名生成不重复新文件名的两种方案

复制代码
package test;

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.Date;
import java.util.Random;

/**
 * 两种上传到服务器端形成新文件名的方案
 * @author hy
 *
 */
public class Test5 {
    public static void main(String[] args) {
        String originalName="abc.edf";
        long uid=4;
        
        System.out.println(buildUpname1(uid,originalName));
        System.out.println(buildUpname2(uid,originalName));
    }
    
    /**
     * 按时间戳+随机数+用户ID+原名生成不重复新文件名的方案一
     * 此方案胜在一目了然,败在长度
     * @param uid
     * @param originalName
     * @return
     */
    private static String buildUpname1(long uid,String originalName) {
        SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
        
        StringBuilder sb=new StringBuilder();
        sb.append(sdf.format(new Date()));
        Random rnd=new Random();
        sb.append(rnd.nextInt(100));
        sb.append(uid);
        sb.append("_"+originalName);
    
        return sb.toString();
    }
    
    /**
     * 按时间戳+随机数+用户ID+原名生成不重复新文件名的方案二
     * 此方案胜在相对短小,有些神秘感,败在还原不便
     * @param uid
     * @param originalName
     * @return
     */
    private static String buildUpname2(long uid,String originalName) {
        LocalDate today=LocalDate.now();
        int yearsAfter2020=today.getYear()-2020;
        int days=today.getDayOfYear();
        
        LocalTime now=LocalTime.now();
        int seconds=now.toSecondOfDay();
        
        // %02d 数字两位左补零;%-nS 固定长度为n的字符串,如要继续缩短可以去掉定长
        String prefix=String.format("%02d%-3s%-5s", yearsAfter2020,Long.toHexString(days),Long.toHexString(seconds));
        
        StringBuilder sb=new StringBuilder();
        sb.append(prefix);
        Random rnd=new Random();
        sb.append(rnd.nextInt(100));
        sb.append(uid);
        sb.append("_"+originalName);
    
        return sb.toString();
    }
}
复制代码

输出:

20211229205152844_abc.edf
0116b12568494_abc.edf

END

posted @   逆火狂飙  阅读(1401)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2019-12-29 【高中数学/对数函数】已知:a=ln1/2,b=ln(lg2),c=lg(ln2) 求:a、b、c的大小关系?
2019-12-29 【Java/数字转字符串】将浮点数转字符串,并保留n位小数的四种方法
2017-12-29 不用一个判断,用JS直接输出勾股数
2017-12-29 你至少拥有两大强大的武器:一、专注力;二、创造力
2017-12-29 【Canvas与标牌】红绿白三色“二广高速”标牌
2014-12-29 【Canvas与艺术】包络线旋转而成的蓝色X之眼
2014-12-29 【Canvas与诗词】《侠客行》节选
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东
点击右上角即可分享
微信分享提示