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