您好,登錄后才能下訂單哦!
基于 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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。