美文网首页Java 杂谈程序员技术栈GitHub 中文社区
基于 java 注解的 csv 文件读写框架

基于 java 注解的 csv 文件读写框架

作者: 老马啸西风2020 | 来源:发表于2019-06-03 19:01 被阅读2次

    csv

    基于 java 注解生成加签验签 csv。

    开源地址: [github csv](https://github.com/houbb/csv

    创作原由

    以前觉得 csv 文件的多写非常简单,就懒得封装。

    最近一个月写了两次 csv 文件相关的东西,发现要处理的细节还是有的,还浪费比较多的时间。

    比如:

    1. UTF-8 中文编码使用 excel 打开乱码,因为缺少 BOM 头。

    2. 不同类型字段转化为字符串,顺序的指定,head 头的指定,如果手写都会很繁琐。

    3. 读取的时候最后 , 后无元素,split 会缺失等。

    为了解决上述问题,此框架应运而生。

    特性

    • Fluent 流式写法

    • 基于 java 注解

    • 字段类型转换的灵活支持,内置 8 大基本类型以及 String 类型转换

    快速开始

    环境

    jdk7+

    maven 3.x

    maven 引入

    <dependency>
        <groupId>com.github.houbb</groupId>
        <artifactId>csv</artifactId>
        <version>0.0.2</version>
    </dependency>
    

    示例代码

    • User.java

    演示基本类型的转换

    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 引导类

    为了用户使用的便利性,和后期拓展的灵活性。

    引导类

    CSV 有两个引导类:

    名称 作用
    CsvWriteBs csv 文件写入引导类
    CsvReadBs csv 文件读取引导类

    CsvWriteBs

    方法 默认值 说明
    newInstance(final String path) 必填 创建实例,并且指定待写入文件路径。
    writeBom(boolean writeBom) true 是否写入 UTF8 BOM 头,建议第一次写入指定,避免中文乱码
    charset(String charset) UTF-8 指定文件编码
    sort(ISort sort) NoSort 默认不进行字段排序
    write(List<T> list) 待写入的文件列表

    CsvReadBs

    方法 默认值 说明
    newInstance(final String path) 必填 创建实例,并且指定待读取文件路径。
    charset(String charset) UTF-8 指定文件编码
    sort(ISort sort) NoSort 默认不进行字段排序
    startIndex(int startIndex) 1 文件的第二行,默认第一行是 head
    endIndex(int endIndex) 文件的最后一行

    Csv 注解

    注解属性说明

    用于待处理对象的字段上。

        /**
         * 字段显示名称
         * 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()
    }
    

    ReadDateConvert/WriteDateConvert

    使我们自定义的针对 Date 的转换实现。

    • Write
    public class WriteDateConvert implements IWriteConverter<Date> {
    
        @Override
        public String convert(Date value) {
            DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
            return dateFormat.format(value);
        }
    
    }
    
    • ReadDateConvert
    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}]
    

    相关文章

      网友评论

        本文标题:基于 java 注解的 csv 文件读写框架

        本文链接:https://www.haomeiwen.com/subject/emjhxctx.html