package com.dy.pipIrrWebFile.fm; 
 | 
  
 | 
import java.util.Calendar; 
 | 
  
 | 
public class FileNameIdUtil { 
 | 
  
 | 
    private static int add = 0 ; 
 | 
    private static int chengShu = 1000 ; 
 | 
    private static int maxAdd = 999 ; 
 | 
    private static long last = 0 ; 
 | 
     
 | 
    //后缀 
 | 
    private static String suffix = "0" ; 
 | 
  
 | 
    static { 
 | 
        last = current() ; 
 | 
    } 
 | 
     
 | 
    /** 
 | 
     * 为自实现程序提供的ID生成器 
 | 
     * 15长度ID,年度取两位,如果是17位长度ID,年度取四位,那17位数字超出了javascript的表数范围  
 | 
     */ 
 | 
    public  String generate(){ 
 | 
        return doGenerate() ;     
 | 
    } 
 | 
     
 | 
    /** 
 | 
     * 设置后缀,不同子系统设置不同的后缀 
 | 
     * @param suffix 
 | 
     */ 
 | 
    public static void setSuffix(String suffix)throws Exception{ 
 | 
        if(suffix == null || suffix.trim().equals("")){ 
 | 
            throw new Exception("后缀不能为空") ; 
 | 
        } 
 | 
        FileNameIdUtil.suffix = suffix.trim() ; 
 | 
    } 
 | 
     
 | 
    /** 
 | 
     * 执行生成 
 | 
     * @return 
 | 
     */ 
 | 
    private synchronized String doGenerate(){ 
 | 
        Long id = null ; 
 | 
        long now = current() ; 
 | 
        if(now != last){ 
 | 
            //上次生成ID 与本次生成ID 不在同一秒内 
 | 
            last = now ; 
 | 
            add = 0 ; 
 | 
            id = last * chengShu + add ++; 
 | 
        }else{ 
 | 
            //上次生成ID 与本次生成ID 在同一秒内 
 | 
            if(add == maxAdd){ 
 | 
                //附加量已经用尽 
 | 
                waitNextSecond(last) ;//等到下一秒 
 | 
                id = last * chengShu + add ++ ;//返回上一秒生成的ID 
 | 
                add = 0 ;//附加量归零,为下一秒准备 
 | 
            }else{ 
 | 
                //附加量未用尽 
 | 
                id = last * chengShu + add ++ ; 
 | 
            } 
 | 
        } 
 | 
        return id + suffix ;     
 | 
    } 
 | 
    /** 
 | 
     * 等待下一秒到来 
 | 
     * @param last 
 | 
     */ 
 | 
    private void waitNextSecond(Long last){ 
 | 
        try { 
 | 
            Thread.sleep(10); 
 | 
        } catch (InterruptedException e) { 
 | 
        }finally{ 
 | 
            long now = current() ; 
 | 
            if(now == last){ 
 | 
                waitNextSecond(last) ; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    
 | 
     
 | 
    /** 
 | 
     * 格式为 150516010203 
 | 
     * @return 
 | 
     */ 
 | 
    private static long current(){ 
 | 
        Calendar cal = Calendar.getInstance(); 
 | 
        long d = (cal.get(Calendar.YEAR) % 100) * 10000000000L  
 | 
        + (cal.get(Calendar.MONTH) + 1) * 100000000L  
 | 
        + cal.get(Calendar.DAY_OF_MONTH) * 1000000L  
 | 
        + cal.get(Calendar.HOUR_OF_DAY) * 10000L  
 | 
        + cal.get(Calendar.MINUTE) * 100L  
 | 
        + cal.get(Calendar.SECOND)  ; 
 | 
         
 | 
        return d ; 
 | 
    } 
 | 
  
 | 
    public static void main(String args[]){ 
 | 
        FileNameIdUtil o = new FileNameIdUtil() ; 
 | 
        int total = 800 ; 
 | 
        long start = System.currentTimeMillis() ; 
 | 
        for(int i = 0 ; i < total ; i++){ 
 | 
            System.out.println((String)(o.generate())) ; 
 | 
        } 
 | 
        long end = System.currentTimeMillis() ; 
 | 
        System.out.println("产生" + total + "ID用时" + (end - start) + "毫秒"); 
 | 
    } 
 | 
     
 | 
} 
 |