猛禽洛的程式筆記庫

[Java] 判斷日期變化(或其他變化)來自動開啟新檔案寫入資料

有時候我們會需要一天開啟一個檔案,讓每個檔案依照日期來做切割分類,這邊我寫好了一套邏輯,當日期有變化時(或是指定的資訊有變化時),可以自動關閉檔案並開新檔案繼續寫入,並且在初始化時,可以直接開新檔案。

1.建立所需的變數:

private String rawDataFileDate = "";//檔名日期(做判斷的依據)
private boolean isRawDataWrite = false;//目前是否為寫入狀態

//寫檔資料流
private BufferedOutputStream bosRawData;
private OutputStream osRawData;

2.先建立結束寫檔的功能:

private void stopRawDataOutput(){
    try{
        if(bosRawData != null){
            bosRawData.flush();
            bosRawData.close();
            bosRawData = null;
        }
        if(osRawData != null){
            osRawData.flush();
            osRawData.close();
            osRawData = null;
        }
        LogUtil.d("stopRawDataOutput", "寫入成功結束");
    } catch (IOException e) {
        e.printStackTrace();
    }

}

3.再來是主要的開檔與寫入邏輯:

//開始寫入Data
private void writeRawData(String writeData){
    try{
        String currentDate = DateProcess.getFormatDate(dateFormatRawDataFileName);
        //日期有變化
        if(!rawDataFileDate.equals(currentDate)){
            rawDataFileDate = currentDate;
            stopRawDataOutput();
            isRawDataWrite = false;
        }

        if(isRawDataWrite){//寫入檔案
            if(bosRawData != null){
                bosRawData.write(writeData.getBytes());
            }
        }else{//開新檔案並寫入
            File fileRawData = new File(rawDataFolder, rawDataFileDate + subFileName);
            osRawData = new FileOutputStream(fileRawData, true); // 要寫出的檔案位置
            bosRawData = new BufferedOutputStream(osRawData, 1024); // 以緩衝串流寫出
            bosRawData.write(writeData.getBytes());
            bosRawData.flush();
            isRawDataWrite = true;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

說明:

每次寫入前都與最新的日期做比較,當日期與現在不同時,就關閉檔案(第一次沒檔案可關閉,就會略過),並且將TAG設為false。

再來判斷TAG狀態是否可寫入,當上方日期不同的情況成立時,就會先開新檔案,並將還沒寫入的資料寫入,然後將TAG設為true,當下次進來時,就可以直接寫入資料。

所以只要呼叫:

writeRawData("要寫入的資料");

就可以自動開檔寫入了,當日期變更時也就能夠自動關檔並開新的檔案。

離開時記得要關閉寫入檔案:

stopRawDataOutput();

-END-

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *