您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        基于 java 注解生成加签验签 csv。
开源地址: " rel="nofollow">github csv
以前觉得 csv 文件的多写非常简单,就懒得封装。
最近一个月写了两次 csv 文件相关的东西,发现要处理的细节还是有的,还浪费比较多的时间。
比如:
UTF-8 中文编码使用 excel 打开乱码,因为缺少 BOM 头。
不同类型字段转化为字符串,顺序的指定,head 头的指定,如果手写都会很繁琐。
, 后无元素,split 会缺失等。为了解决上述问题,此框架应运而生。
Fluent 流式写法
基于 java 注解
jdk7+
maven 3.x
<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>csv</artifactId>
    <version>0.0.2</version>
</dependency>
演示基本类型的转换
public class User {
    private String name;
    private int age;
    private float score;
    private double money;
    private boolean sex;
    private short level;
    private long id;
    private char status;
    private byte coin;
    //Getter & Setter & toString()
}
    /**
     * 构建通用测试列表
     * @return 列表
     */
    private List<User> buildCommonList() {
        User user = new User();
        short s = 4;
        byte b = 1;
        user.age(10)
        .name("你好")
        .id(1L)
        .score(60)
        .coin(b)
        .level(s)
        .money(200)
        .sex(true)
        .status('Y');
        return Arrays.asList(user);
    }
public void commonTest() {
    final String path = "src\\test\\resources\\common.csv";
    CsvWriteBs.newInstance(path)
            .write(buildCommonList());
}
name,age,score,money,sex,level,id,status,coin
你好,10,60.0,200.0,true,4,1,Y,1
public void commonTest() {
    final String path = "src\\test\\resources\\common.csv";
    List<User> userList = CsvReadBs.newInstance(path)
            .read(User.class);
    System.out.println(userList);
}
[User{name='你好', age=10, score=60.0, money=200.0, sex=true, level=4, id=1, status=Y, coin=1}]
为了用户使用的便利性,和后期拓展的灵活性。
CSV 有两个引导类:
| 名称 | 作用 | 
|---|---|
| CsvWriteBs | csv 文件写入引导类 | 
| CsvReadBs | csv 文件读取引导类 | 
| 方法 | 默认值 | 说明 | 
|---|---|---|
| newInstance(final String path) | 必填 | 
创建实例,并且指定待写入文件路径。 | 
| writeBom(boolean writeBom) | true | 
是否写入 UTF8 BOM 头,建议第一次写入指定,避免中文乱码 | 
| charset(String charset) | UTF-8 | 
指定文件编码 | 
| sort(ISort sort) | NoSort | 默认不进行字段排序 | 
| write(List<T> list) | 无 | 
待写入的文件列表 | 
| 方法 | 默认值 | 说明 | 
|---|---|---|
| newInstance(final String path) | 必填 | 
创建实例,并且指定待读取文件路径。 | 
| charset(String charset) | UTF-8 | 
指定文件编码 | 
| sort(ISort sort) | NoSort | 默认不进行字段排序 | 
| startIndex(int startIndex) | 1 | 文件的第二行,默认第一行是 head | 
| endIndex(int endIndex) | 文件的最后一行 | 
用于待处理对象的字段上。
    /**
     * 字段显示名称
     * 1. 默认使用 field.name
     * @return 显示名称
     */
    String label() default "";
    /**
     * 读取是否需要
     * @return 是
     */
    boolean readRequire() default true;
    /**
     * 写入是否需要
     * @return 是
     */
    boolean writeRequire() default true;
    /**
     * 读取转换
     * @return 处理实现类
     */
    Class<? extends IReadConverter> readConverter() default CommonReadConverter.class;
    /**
     * 写入转换
     * @return 处理实现类
     */
    Class<? extends IWriteConverter> writeConverter() default StringWriteConverter.class;
| 属性 | 默认值 | 说明 | 
|---|---|---|
| label | 字段名称 | 用于 csv 头生成 | 
| readRequire | true | 是否需要从 csv 文件读取 | 
| writeRequire | true | 当前字段是否需要写入 csv 文件 | 
| readConverter | CommonReadConverter | 将 csv 中的字符串转化为当前字段类型,支持 8 大基本类型+String | 
| writeConverter | StringWriteConverter | 直接调用当前字段值 toString() 方法,null 直接为空字符串 | 
其中 readConverter/writeConverter 支持用户自定义
public class UserAnnotation {
    @Csv(label = "名称")
    private String name;
    @Csv(label = "密码", readRequire = false, writeRequire = false)
    private String password;
    @Csv(label = "生日", readConverter = ReadDateConvert.class, writeConverter = WriteDateConvert.class)
    private Date birthday;
    //Getter & Setter & toString()
}
使我们自定义的针对 Date 的转换实现。
public class WriteDateConvert implements IWriteConverter<Date> {
    @Override
    public String convert(Date value) {
        DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
        return dateFormat.format(value);
    }
}
public class ReadDateConvert implements IReadConverter<Date> {
    @Override
    public Date convert(String value, Class fieldType) {
        try {
            DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
            return dateFormat.parse(value);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
}
public void annotationTest() {
    final String path = "src\\test\\resources\\annotation.csv";
    CsvWriteBs.newInstance(path)
            .write(buildAnnotationList());
}
其中列表构建:
/**
 * 构建基于注解的测试列表
 * @return 列表
 */
private List<UserAnnotation> buildAnnotationList() {
    UserAnnotation user = new UserAnnotation();
    user.name("你好")
            .password("123")
            .birthday(new Date());
    return Arrays.asList(user);
}
名称,生日
你好,20190603
public void annotationTest() {
     final String path = "src\\test\\resources\\annotation.csv";
     List<UserAnnotation> userList = CsvReadBs.newInstance(path)
             .read(UserAnnotation.class);
     System.out.println(userList);
}
[UserAnnotation{name='你好', password='null', birthday=Mon Jun 03 00:00:00 CST 2019}]
													免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。