java订单生成
2012-06-07 22:28
274 查看
package com.accp.zl.filter; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; /** * JAVA版本的自动生成有规则的订单号(或编号) * 生成的格式是: 200908010001 前面几位为当前的日期,后面五位为系统自增长类型的编号 * 原理: * 1.获取当前日期格式化值; * 2.读取文件,上次编号的值+1最为当前此次编号的值 * (新的一天会重新从1开始编号) * * 存储自动编号值的文件如下(文件名: EveryDaySerialNumber.dat) */ public class Test01 { public static void main(String[] args) throws InterruptedException { SerialNumber serial = new FileEveryDaySerialNumber(6, "EveryDaySerialNumber1.dat"); // while(true) { System.out.println(serial.getSerialNumber()); // TimeUnit.SECONDS.sleep(2); // } } } abstract class SerialNumber { public synchronized String getSerialNumber() { return process(); } protected abstract String process(); } abstract class EveryDaySerialNumber extends SerialNumber { protected final static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); protected DecimalFormat df = null; public EveryDaySerialNumber(int width) { if(width < 1) { throw new IllegalArgumentException("Parameter length must be great than 1!"); } char[] chs = new char[width]; for(int i = 0; i < width; i++) { chs[i] = '0'; } df = new DecimalFormat(new String(chs)); } protected String process() { Date date = new Date(); int n = getOrUpdateNumber(date, 1); return format(date) + format(n); } protected String format(Date date) { return sdf.format(date); } protected String format(int num) { return df.format(num); } /** * 获得序列号,同时更新持久化存储中的序列 * @param current 当前的日期 * @param start 初始化的序号 * @return 所获得新的序列号 */ protected abstract int getOrUpdateNumber(Date current, int start); } class FileEveryDaySerialNumber extends EveryDaySerialNumber { /** * 持久化存储的文件 */ private File file = null; /** * 存储的分隔符 */ private final static String FIELD_SEPARATOR = ","; public FileEveryDaySerialNumber(int width, String filename) { super(width); file = new File(filename); } @Override protected int getOrUpdateNumber(Date current, int start) { String date = format(current); int num = start; if(file.exists()) { List<String> list = FileUtil.readList(file); String[] data = list.get(0).split(FIELD_SEPARATOR); if(date.equals(data[0])) { num = Integer.parseInt(data[1]); } } FileUtil.rewrite(file, date + FIELD_SEPARATOR + (num + 1)); return num; } } class FileUtil { public static void rewrite(File file, String data) { BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter(file)); bw.write(data); } catch (IOException e) { e.printStackTrace(); } finally { if(bw != null) { try { bw.close(); } catch(IOException e) { e.printStackTrace(); } } } } public static List<String> readList(File file) { BufferedReader br = null; List<String> data = new ArrayList<String>(); try { br = new BufferedReader(new FileReader(file)); for(String str = null; (str = br.readLine()) != null; ) { data.add(str); } } catch (IOException e) { e.printStackTrace(); } finally { if(br != null) { try { br.close(); } catch(IOException e) { e.printStackTrace(); } } } return data; } }
相关文章推荐
- java生成订单编号工具
- Java 编程 订单、支付、退款、发货、退货等编号主动生成类
- Java零基础入门到高级应用-订单生成策略
- java生成订单编号工具
- Java互联网架构-Mysql分库分表订单生成系统实战分析
- 关于java反射生成类对象以及执行指定的方法
- java如何生成二维码图片
- [JavaWeb]将Web页面内容生成图片
- 基于注解和反射的Java ORM框架(6)-数据库自动生成Java实体类源码
- 记录 idea java类实现序列化后生成序列化id
- java中自动生成注册码的代码
- java主键生成策略
- java生成图片验证码
- java-后台生成图表、并将图表保存为PNG图片
- 微博短链接的生成算法(Java版本)
- Java生成EXE
- java代码(生成long类型数字)
- axis根据wsdl文件或wsdl地址生成java文件(转帖)
- java生成excel
- JAVA生成有规则的订单号