基於 java 註解生成加簽驗籤 csv。java
開源地址: github csv
)git
之前以爲 csv 文件的多寫很是簡單,就懶得封裝。github
最近一個月寫了兩次 csv 文件相關的東西,發現要處理的細節仍是有的,還浪費比較多的時間。框架
好比:maven
,
後無元素,split 會缺失等。爲了解決上述問題,此框架應運而生。ide
jdk7+測試
maven 3.xui
<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}]