Listener-监听者:
监听者的实现类负责具体处理实际流程中中的事件信息。
public interface DataListener<T> {
/**
* CsvUtils 每读到一条数据, 都会调用一次此方法
*
* @param data 数据对象
*/
void onData(T data);
/**
* 全部记录读取完毕后, 会调用一次此方法
*/
void allOver();
void onException(Exception exception);
}
Content-被监听者:
每读取一行数据,将被读取的数据传递给监听者进行处理,若发生了异常,也将异常信息传递给监听者处理即可。
public static <T> void parse(Reader reader, DataListener<T> listener) throws IOException {
try (Reader rder = reader;
CSVParser csvParser = CSVFormat.RFC4180.withCommentMarker('#')
.withTrim().withNullString("null").withFirstRecordAsHeader().parse(rder)) {
Iterator<CSVRecord> iterator = csvParser.iterator();
iterator.forEachRemaining(record -> {
try {
if (!record.isConsistent()) {
throw new IllegalStateException("the csv record size does not match the header size, "
+ "record number = " + record.getRecordNumber());
}
T entity =reader.readLine();
listener.onData(entity);
} catch (Exception e) {
listener.onException(e,record);
}
});
listener.allOver();
}
}