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

csv

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

创作原由

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

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

比如:

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

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

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

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

特性

Fluent 流式写法

基于 java 注解

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

快速开始

环境

jdk7+

maven 3.x

maven 引入

com.github.houbb

csv

0.0.6

示例代码

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 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 {

@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}]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值