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