java随机生成文件名,怎么不重复

解决方案 »

  1.   

    rstring = RandomStringUtil.getString(6);很少重复,可以调整参数,那样重复的几率就几乎不存在了。
    最好生成文件名后在判断一次是否存在,存在则重新生成。
      

  2.   

    这是RandomStringUtil的class
    public class RandomStringUtil {    public static String getString(int length){
        
         char[] charArray = new char[length];
        
         for(int i=0;i<length;i++){
        
         Random r = new Random();
         int n = r.nextInt(123);
         while(n<48 || (n>57 && n<65) || (n>90 && n <97) || n>122){//(!((n>=48 && n<=57) || (n>=65 && n<=90) && (n>=97 && n<=122))){
                    n = r.nextInt(123);
         }
    charArray[i] = (char)n ;
         }
        
         return String.valueOf(charArray) ;
        
        }
    }
      

  3.   

    用当前时间+N位随机数
    private String generateFileName() {
    // 获得当前时间
    DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
    // 转换为字符串
    String formatDate = format.format(new Date());
    // 随机生成文件编号
    int random = new Random().nextInt(10000);
    return new StringBuffer().append(formatDate).append(
    random).toString();
    }
      

  4.   

    方法1:使用java.util.UUID/**
     * @author troy(J2EE)
     * @version 1.0
     */
    import java.util.UUID;
    public class Test
    {
    public static void main(String[] args) { 
    UUID uuid = UUID.randomUUID(); 
    System.out.println(uuid); 

    }
    方法二(推荐)
    文件名后面加个时间戳
    /**
     * @author troy(J2EE)
     * @version 1.0
     */
    import java.util.Date;
    public class Test
    {
    public static void main(String[] args) { 
            String  fielName = String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %1$tL",new Date())+".txt";
    System.out.println(fielName); 

    }其他诸如使用集合set,for循环判断重复的就不推荐了 
      

  5.   

     这中间 的 ‘//’在java中是不对的吧 需要转义啊怎么转啊
      

  6.   

    以下代码供参考:
    String str[] = { "a", "b", "c", "d", "e", "f", "g",
                                  "h", "i", "j" };
                 Random tmp = new Random();
                 fileName = System.currentTimeMillis()
                                      + str[tmp.nextInt(10)] + "." + fileType;
      

  7.   

    UUID uuid = UUID.randomUUID();  
    我也用这个,不过它有36位.比较长.
      

  8.   

        Date date = new Date();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddkkmmss");
    String filename = "文件名" + sdf.format(date) + "文件名的后缀";
      这样 就永远不会重复了.  
      

  9.   

    用时间,精确到毫秒
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmssSSS");
      

  10.   

    很简单~~~UUID+随便选一个随机数~~
      

  11.   

    用 UUID 吧,其他的不管你用毫秒或者是什么都有可能会产生重复。
      

  12.   

    学习了感觉如果用时间的话,不精确到毫秒,也许就有问题这个得看具体的运行时间了。。UUID,应该可以吧
      

  13.   

    根据字母和数字的个数的10此方等(26+9)^10的概率可以减少重复问题....话句话说,每个用户的文件名称重复的概率只有:1/(26+9)^10几率........例子:
    String[] temp=new String[]{"a","b"....."z","1"......"9"}String result=null;Random rand=new Random();for(int i=0;i<temp.length;i++){
        int j=rand.nextInt((26+9));
        String str+=temp[j];
        result=str;
    }
      

  14.   

    又学习到了可以用uuid
    以前一直是时间加个随机数的方式去做。
      

  15.   

    haha  这跟上传文件避免名字重复是一样的吧
      

  16.   

    UUID嘛,本来就是为了不重复而设计的
      

  17.   

    系统时间就没有重复的
    除非你非要更改时间
    别random
    一百万次或者一百万亿次总会重复的
    时间肯定不重复
    System.getCurrentTime()不是很好的嘛
      

  18.   

    for循环,那个判断条件却数组名丫
      

  19.   

    用UUID的确是王者之道,我也同意上面的说法,不过看你要求了,我测试过一个UUID的生成需要一百多毫秒,几次下来125~163毫秒不等,普通的成百行的代码是以纳秒计算速度,我一般要不重复很简单,我最喜欢的是用毫秒值,如果不放心在加一段随机数吧,这个重复的概率几乎为0,提取毫秒值很简单:
    System.currentTimeMillis();//long型数据,就这么简单
    呵呵,参考,不行还有纳秒值,一般一行最简单的代码执行也要很多纳秒呢,呵呵。
      

  20.   

    建议楼主 有些问题还是google问下 马上能得到答案! 比较难的你才来这问省积分啊
      

  21.   

    按钮要求的等级来选择不同的方法,1. 要求一般的, 随机数,然后判断是否已经存在了,否则成功,是则循环。
     有点恶心,几万个或者几百万个之后还不判断死了。
    2. 用时间+随机数,只要时间足够精确,而且是获取的真实时间,不是OS系统里的时间。
     这种方法也挺不爽。。  要求必须是实际时间。而且整个随机数是一半伪随机的一半是有规律性的(时间是递增的),另外,也无法保证两个对象同时刻运行时不产生相同的数!
    3. 用UUID。 这种方法能保证万无一失。 虽然有点耗时间。 但毕竟是别人已经总结好的非常成熟的算法,com中用到的id值能够保证时间与空间上的绝对唯一性。 我想JAVA的uuid也是可以保证的。世界上任意两个地方在任何时间永远不可能产生同一个数。 如果你的系统要保证绝对的可靠这种方法可行。
      

  22.   

    while(n<48 || (n>57 && n<65) || (n>90 && n <97) || n>122){//(!((n>=48 && n<=57) || (n>=65 && n<=90) && (n>=97 && n<=122)))   什么意思?看不懂
      

  23.   

    文件名后面加 System.currentTimeMillis()
      

  24.   

    这个不会重复。你知道UUID的原理么
      

  25.   

    UUID.randomUUID()while(重复){
    UUID.randomUUID()
    }
      

  26.   

    JAVA生成不重复的临时文件的方法
    import java.io.File;/**
     * JAVA生成不重复的临时文件的方法。
     * 
     * @author JAVA世纪网(java2000.net)
     */
    public class Test {
      public static void main(String[] args) throws Exception {
        File f = File.createTempFile("test", "file");
        // 
        // C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\test3654095372928367563file
        System.out.println(f.getAbsolutePath());
        f.deleteOnExit();
      }
    }
      

  27.   

    我来发个不同的声音吧,单例模式(singleton), 使用一个计数器,在程序退出时候,保存当前值。在程序启动的时候,读入上次保存的值注意,需要线程同步
    前面诸位说的用时间的毫秒数也可以,不过注意一点,也需要加上线程同步。不然有可能2个线程得到同一个值
      

  28.   

    UUID永远都不会重复  不过我一般用精确到毫秒的时间加几个随机数字
      

  29.   

    加上当前的时间戳 文件名+System.currentTimeMillis()
      

  30.   

    取系统的当前是时间(纳秒)做为新的文件名.
    long time = System.nanoTime();
    将文件重命名fileName.renameTo(time + fileName);
      

  31.   

    uuid,还是时间戳,都不错,但要想完全避免重复(时间可能不在同一天而重复,除非年月日,时分秒,但太大太了),最好判定哈吧!用hashtable进行判定吧
      

  32.   

    UUID,不会重复,但比较长,用时间戳也是个好主意
      

  33.   

    是的 hibernate 有一种主键生成方式好象 就是 uuid
      

  34.   

    用时间,精确到毫秒
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmssSSS");
      

  35.   

    [Quote=引用 1 楼 dqlmj2009 的回复:]
    rstring = RandomStringUtil.getString(6);很少重复,可以调整参数,那样重复的几率就几乎不存在了。
    最好生成文件名后在判断一次是否存在,存在则重新生成。
      

  36.   

    和3楼的意见是一样的UUID,正常情况下这辈子都重复不了了
      

  37.   

    UUID uuid = UUID.randomUUID();
    String fileName = uuid.toString();
      

  38.   

    public static String getUqFileName(String ext){
    String result="";
    StringBuffer sb=new StringBuffer();
    sb.append(toString(new java.util.Date(),"yyyyMMddhhmmssSSS"));
    sb.append(getRandomString(8));
    ext=toNotNull(ext,".jpg").trim();
    if(!ext.equals("")){
    if(!ext.startsWith(".")){
    sb.append('.');
    }
    sb.append(ext);
    }
    result=sb.toString();
    return result;
    } public static final String getRandomString(int length) {
    if (length < 1) {
    return null;
    }
    char[] numbersAndLetters = ("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
    .toCharArray(); java.util.Random randGen = new java.util.Random(); char[] randBuffer = new char[length];
    for (int i = 0; i < randBuffer.length; i++) {
    randBuffer[i] = numbersAndLetters[randGen.nextInt(61)];
    }
    return new String(randBuffer);
    }
      

  39.   

    public static final String toString(java.util.Date v, String format) {
    java.text.SimpleDateFormat simpleDate = new java.text.SimpleDateFormat(
    format);
    String temp = simpleDate.format(v);
    simpleDate = null;
    return temp;
    }
      

  40.   

    使用UUID不便于按时间范围统计或备份文件,建议使用时间+随机串的方式,即不重复又按时间有规则,可以指定日期段备份或统计
      

  41.   

    神马时间,豪秒,单例,  有一种名词叫集群, 再想想,  都有可能重复, 用UUID, 基本上不会重复