博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于 java 注解的 csv 文件读写框架
阅读量:6704 次
发布时间:2019-06-25

本文共 4844 字,大约阅读时间需要 16 分钟。

csv

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

开源地址:

创作原由

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

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

比如:

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

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

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

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

特性

  • Fluent 流式写法

  • 基于 java 注解

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

快速开始

环境

jdk7+

maven 3.x

maven 引入

com.github.houbb
csv
0.0.2

示例代码

  • 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
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
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
readConverter() default CommonReadConverter.class; /** * 写入转换 * @return 处理实现类 */ Class
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
{ @Override public String convert(Date value) { DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); return dateFormat.format(value); }}
  • ReadDateConvert
public class ReadDateConvert implements IReadConverter
{ @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
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
userList = CsvReadBs.newInstance(path) .read(UserAnnotation.class); System.out.println(userList);}
  • 日志信息
[UserAnnotation{name='你好', password='null', birthday=Mon Jun 03 00:00:00 CST 2019}]

转载于:https://blog.51cto.com/9250070/2404455

你可能感兴趣的文章
索尼公司宣布公司架构及管理结构调整
查看>>
苹果:很快就能找到FBI利用的漏洞
查看>>
引领新ICT 华为企业业务参加CeBIT 2016预热大会
查看>>
戴尔在新加坡设立IoT实验室
查看>>
云南:加强数据开放共享 服务农业产业化
查看>>
拆分一年多了,“两个惠普”公司过得还好不好?
查看>>
电脑病毒或可通过声音进行传播?
查看>>
几个Linux驱动面试题目
查看>>
外媒分析富士康收购夏普的5大原因
查看>>
强强联手-赛迪中科数据中心联合实验室应运而生
查看>>
Web应用防火墙:必须拥有还是面临淘汰?
查看>>
码农的性能测试
查看>>
微软孵化平台筑“巢”南京
查看>>
我的第一个物联网项目:一份企业物联网项目指南
查看>>
安防迎来5G时代来临 是机遇还是挑战?
查看>>
中情局黑客武器库曝光,苹果安卓加密系统均被突破
查看>>
对Gogo不满 微软也来掺和飞机WiFi服务
查看>>
diy高手在民间
查看>>
国产IT彪起来了,后浪要将前浪拍死在沙滩上
查看>>
安防软件系统集成解决方案 想说爱你不容易
查看>>