2013-05-29 120 views
2

該應用程序記錄傳感器數據並將數據寫入.txt文件到手機SD卡中。Android - 刪除.txt文件中最後一個不完整的行

在數據收集過程中,可以隨時按停止按鈕停止書寫。

有關書寫部如下:

myFile = new File("/sdcard/ResearchData/" 
          + txtData.getText() + ".txt"); 
        myFile.createNewFile(); 

        fOut = new FileOutputStream(myFile); 
        myOutWriter = new OutputStreamWriter(fOut); 
        myBufferedWriter = new BufferedWriter(myOutWriter); 
        myPrintWriter = new PrintWriter(myBufferedWriter); 

myPrintWriter.write(currentTime - startTime + " " + acceleration[0] 
        + " " + acceleration[1] + " " + acceleration[2] + "\n"); 

一旦按下STOP鍵,以下代碼被執行。

myOutWriter.close(); 
fOut.close(); 

的代碼運行不錯,但唯一的問題是,由於人們可以隨時按下停止,所以.txt文件的最後一行始終是不完整的。由於需要數據分析,我需要這些數據是一個很好的矩形矩陣。因此,我需要刪除最後一個不完整的行。我該怎麼做?

或從另一個角度解決這個問題。我可以使STOP按鈕與寫入過程同步嗎?即一行完成寫入後,檢查STOP。

回答

1

您需要一個變量bool類型,最初是false,我們稱之爲isStopPressed

在按鈕的關閉事件中,您應該將其分配給true

我假設你在頂層函數裏面創建你的文件,並在onSensorChanged()函數中修改這個文件。

然後,這條線

myPrintWriter.write(currentTime - startTime + " " + acceleration[0] 
        + " " + acceleration[1] + " " + acceleration[2] + "\n"); 

後,你需要一個像條件,

if(isStopPressed) { 
    mSensorManager.unregisterListener([Your Sensor Listener]); 
    myOutWriter.close(); 
    fOut.close(); 
} 

這將爲您提供最全面,最有效的時間間隔爲您的需求。

+0

是的,你的假設對我而言都是有效的。所以你的想法是:一旦停止按鈕被按下,你關閉所有的傳感器,以便onSensorChanged()方法不會被調用?這可以確保最後一行數據已完全寫入? –

+0

是的,因爲您在寫入最後一行後取消註冊傳感器偵聽器並關閉文件。 – faradaj

1

您可以嘗試設置布爾標誌,如isStopped來指示按下STOP按鈕。 按下STOP按鈕時,將isStopped標誌設置爲true。 在你的文件寫入部分,檢查isStopped標誌。如果它是真的,退出循環並關閉文件。否則,代碼可以繼續向文件寫入行。

+0

不可以。你所說的正是我所做的。正確的,它應該工作,但不知何故,寫作過程仍然會被打斷。 –

+0

您可以嘗試在myOutWriter.close()之前添加'myOutWriter.flush();'並查看它是否有幫助? – TactMayers

+0

仍然沒有工作......嘆...... –

相關問題