New file |
| | |
| | | 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) + "毫秒"); |
| | | } |
| | | |
| | | } |