歡迎關注筆者的公眾號: 小哈學Java, 專注於推送 Java 領域優質干貨文章!!
個人博客: https://www.exception.site/essay/how-to-create-read-csv-by-javacsv
一、背景
小哈公司最近准備開發一套新的平台,具體什么平台,因為涉密,這里就不透露了。平台在最終的的技術選型中,其中主要依賴的技術棧是 Apache Flink, 一款 Apache 基金會開源的流處理框架,平台的核心業務都會交給 Flink 去處理,其中包括離線批量任務計算,以及實時任務計算。
PS: 后面小哈也會分享一些 Flink 相關的文章,正在考慮要不要立個 Flag, 出一套 Flink 的入門教程系列文章,主要怕自己太懶了,潑出去的水,收不回來,那就尷尬了~ 🤣

然后呢?和這篇文章的主題啥關系?
哎,別急,聽我娓娓道來!主要是我們部門也是第一次接觸 Flink, 雖然久聞大名,知道其計算性能極為出眾,但是耳聽為虛,一番性能測試是是避免不的。
於是,小哈以離線場景為例,模擬實際業務數據,輸入源為 csv 編碼文件針對不同量級的數據,100w, 1000w, 一億的數據量做測試,分別看看不同維度的性能指標,如執行耗時、CPU、內存、吞吐量等。
PS: 因為小哈畢竟不是專業的測試人員,這里只是做了一些簡單的測試,對 Flink 的性能有個大致的認知即可。小伙伴們如果有需要,可以使用專門的大數據測試工具,如 HiBench。
這里貼一篇美團技術團隊出品的文章《流計算框架 Flink 與 Storm 的性能對比》,有興趣的小伙伴可以看下:
好了,鋪墊了這么多,其實是想水文一篇,沒啥技術含量,就是給大家推薦第三方工具庫 JavaCSV,用來造一些 csv 測試數據文件,個人覺得它非常地優雅方便 (比較偷懶~ 代碼量少~)。

JavaCSV 官網地址:https://sourceforge.net/projects/javacsv/
JavaCSV API 說明文檔:http://javacsv.sourceforge.net/
二、開始
2.1 添加 Maven 依賴
<dependency>
<groupId>net.sourceforge.javacsv</groupId>
<artifactId>javacsv</artifactId>
<version>2.0</version>
</dependency>
2.2 寫文件
要如何通過 javacsv生成 CSV 文件呢?參考下面的示例代碼:
/**
* @author 犬小哈(公眾號:小哈學Java)
* @date 2019/4/12
* @time 下午3:05
* @discription 讀寫 csv 文件
**/
public class ReadAndWriterCsvFlie {
// 需要寫入的 csv 文件路徑
public static final String WRITE_CSV_FILE_PATH = "/Users/a123123/Work/flink-study/write_test.csv";
/**
* 生成 csv 文件
*/
public static void writeCsvFile(String writeCsvFilePath) {
// 創建 CSV Writer 對象, 參數說明(寫入的文件路徑,分隔符,編碼格式)
CsvWriter csvWriter = new CsvWriter(writeCsvFilePath,',', Charset.forName("GBK"));
try {
// 定義 header 頭
String[] headers = {"訂單號", "用戶名", "支付金額"};
// 寫入 header 頭
csvWriter.writeRecord(headers);
// 寫入一千條記錄
for (int i = 0; i < 1000; i++) {
String orderNum = UUID.randomUUID().toString();
String userName = "用戶" + i;
String payMoney = String.valueOf(i);
// 寫入行
csvWriter.writeRecord((String[]) Arrays.asList(orderNum, userName, payMoney).toArray());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
csvWriter.close();
}
}
public static void main(String[] args) {
writeCsvFile(WRITE_CSV_FILE_PATH);
}
}
通過上面的示例代碼,我們就可以很輕松地造一批測試數據,只需要改下需要生成的行數即可。相比較其他的庫,代碼量還是非常少的。
運行代碼,看下最終的效果圖:

2.1 讀文件
說完了如何通過 javacsv來寫 csv 文件,再來說說如何讀取 csv 文件,就以上面生成的 csv 文件作為讀取源,示例代碼如下:
/**
* @author 犬小哈(公眾號:小哈學Java)
* @date 2019/4/12
* @time 下午3:05
* @discription 讀寫 csv 文件
**/
public class ReadAndWriterCsvFlie {
// 需要寫入的 csv 文件路徑
public static final String WRITE_CSV_FILE_PATH = "/Users/a123123/Work/flink-study/write_test.csv";
/**
* 讀取 csv 文件
*/
public static void readCsvFile(String readCsvFilePath) {
// 緩存讀取的數據
List<String[]> content = new ArrayList<>();
try {
// 創建 CSV Reader 對象, 參數說明(讀取的文件路徑,分隔符,編碼格式)
CsvReader csvReader = new CsvReader(readCsvFilePath, ',', Charset.forName("GBK"));
// 跳過表頭
csvReader.readHeaders();
// 讀取除表頭外的內容
while (csvReader.readRecord()) {
// 讀取一整行
String line = csvReader.getRawRecord();
System.out.println(line);
content.add(csvReader.getValues());
}
csvReader.close();
for (int row = 0; row < content.size(); row++) {
// 讀取第 row 行,第 0 列的數據
String orderNum = content.get(row)[0];
System.out.println("==> orderNum: " + orderNum);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
readCsvFile(WRITE_CSV_FILE_PATH);
}
}
運行代碼,看下控制台打印效果:

打完收工~
總結
本文小哈主要帶着大家了解了一下,如何通過第三方庫 JavaCSV來對 csv 文件進行讀寫操作,實際場景中可能應用並不廣泛,更多還是使用統一的文件庫,如阿里的 EasyExcel,EasyPOI 等, 小哈這里使用,也僅僅是為了造測試數據而已。
PS: 關於 EasyExcel 使用教程, 小伙伴可以看下小哈之前寫的一篇文章:《7 行代碼優雅地實現 Excel 文件生成&下載功能》
好了,水文結束,小伙伴們覺得有幫助記得點個再看哈~ 感謝感謝~ 下期見~

Ref
- https://sourceforge.net/projects/javacsv/
- http://javacsv.sourceforge.net/
- https://blog.csdn.net/StemQ/article/details/60780859?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
- https://segmentfault.com/a/1190000020351726
歡迎關注微信公眾號: 小哈學Java
更多干貨文章,請關注筆者公眾號: 小哈學Java (ID: xiaoha_java), 專注於分享Java領域干貨文章, 不限於 BAT 面試題分享,Spring Boot, Spring Cloud, 高並發,JVM, 數據庫,Docker 容器, ELK 等相關知識,另外,關注回復「資源」,即可獲取全文最熱的 Java 面試&架構學習資源喲~

