zhubaomin
2025-04-07 e67870fff62635cd14beb0d5988f08aeef4b22fa
pipIrr-platform/pipIrr-web/pipIrr-web-file/src/main/java/com/dy/pipIrrWebFile/fm/FileNameIdUtil.java
New file
@@ -0,0 +1,109 @@
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) + "毫秒");
   }
}