2011-12-14 63 views
1

基本上,我試圖將加速度計數據捕獲到一個txt文件中。該代碼將加速度數據寫入一個字符串,然後在每次更改時更新,這通常是。我包括一個開關記錄數據的切換按鈕,應該將其寫入文件。這是奇怪的地方。代碼檢查文件是否已經存在,然後在文件末尾添加一個數字以確保它不覆蓋舊數據。但是,它會創建一個充滿垃圾或損壞數據的文件。我證實,如果文件已經存在,那麼它會將良好的數據寫入文件,但是如果它必須創建文件,它會創建一個損壞的文件。代碼如下所示。不知道文件損壞是怎麼回事。Buffered Writer在創建新文件時加載損壞的數據

package com.accelerometermonitor; 

import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 

import android.app.Activity; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

public class AccelerometerMonitorActivity extends Activity implements OnClickListener{ 
/** Called when the activity is first created. */ 
SensorManager sensorManager; 
Sensor accel; 
TextView xxaxistext; 
TextView yyaxistext; 
TextView zzaxistext; 
Button toggle; 
boolean recordstatus = false; 
StringBuilder databuilder; 
String data; 
TextView testing; 
String xstring; 
String ystring; 
String zstring; 
int filecounter=0; 
boolean notdone = true; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); 
    accel = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
    toggle=(Button)findViewById(R.id.togglebutt); 
    toggle.setOnClickListener(this); 
     xxaxistext=(TextView)findViewById(R.id.xaxistext); 
     yyaxistext=(TextView)findViewById(R.id.yaxistext); 
     zzaxistext=(TextView)findViewById(R.id.zaxistext); 
     testing=(TextView)findViewById(R.id.testtext); 
} 

@Override 
public void onStart(){ 
    super.onStart(); 
    while (notdone) { //establishes existing logfile number to be used and stored 
     File logFile = new File("/sdcard/log"+""+ filecounter +".txt"); 
     if (logFile.exists()){ 
      filecounter++; 
     } 
     else { 
      notdone = false; 
     } 


    } 



} 

protected void onResume() { 
    super.onResume(); 
    sensorManager.registerListener(accelListener, accel,        
SensorManager.SENSOR_DELAY_NORMAL); 
} 

protected void onPause() { 
    super.onPause(); 
    sensorManager.unregisterListener(accelListener); 
} 
private SensorEventListener accelListener = new SensorEventListener(){ 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 

} 

public void onSensorChanged(SensorEvent event) { 

float x = event.values[0]; 
float y = event.values[1]; 
float z = event.values[2]; 
update(x, y, z); 


} 
}; 
public void update (float x, float y, float z){//sets textview to appropriate number 
    xxaxistext.setText("X Axis:" +""+ x); 
    yyaxistext.setText("Y Axis:" +""+ y); 
    zzaxistext.setText("Z Axis:" +""+ z); 
    //save to string 
    data=""; 
xstring=("" + x); 
ystring=("" + y); 
zstring=("" + z); 

data=data.concat(xstring + "," + ystring +"," + zstring +"\n"); 


    // testing.setText("result:" + data); 

    appendLog(data, filecounter); 
    } 


    public void onClick(View target) { 

    if (recordstatus==false){ 

      toggle.setText("Stop");  
     recordstatus = true; 
     appendLog(data, filecounter); 
     testing.setText("Logging"); 

    } 
    else{ 
     //Stop recording 
     recordstatus = false; 
    toggle.setText("Start"); 
    testing.setText("logging stopped"); 
    filecounter++; 
    } 
    } 

    public void appendLog(String text, int filecounter) 
    {  
     if(recordstatus==true){ 

      File logFile = new File("/sdcard/log"+""+ filecounter +".txt"); 

    testing.setText("working"); 
    if (!logFile.exists()) 
    { 
     try 
     { 
     logFile.createNewFile(); 
    Toast toast= Toast.makeText(this,"new file created",0); 
    toast.show(); 
    BufferedWriter buf1 = new BufferedWriter(new FileWriter(logFile , false)); 
    buf1.write(13); 
    buf1.newLine(); 
    buf1.flush(); 
    buf1.close(); 

     } 
    catch (IOException e) 
     { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    } 
    try 
    { 
     // File logaFile = new File("/sdcard/log"+""+ filecounter +".txt"); 
     //BufferedWriter for performance, true to set append to file flag 
     //FileWriter logFile=new FileWriter(logaFile , false); 

     BufferedWriter buf = new BufferedWriter(new FileWriter(logFile , true)); 
     buf.append(text); 
     buf.newLine(); 
     buf.flush(); 
     buf.close(); 
    testing.setText("append working"); 
    } 
    catch (IOException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
        } 
    else{ 

    } 
    } 

我在清單

"<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>" 

的與損壞數據

#EO'MyÎ&¸OE-`ID ïÇDêç³òß¼( 帖 û日誌文件的例子聲明'æÁ9Û™íb_CONSOLE·óZub™

讓我知道您的想法

回答

1

我有一個droid X,我發現當你連接droid x作爲USB存儲設備時,創建並存儲在手機上的任何東西都被加密。這就是爲什麼當我查看數據時,它似乎是腐敗的。當我在PC模式下掛斷電話時,它允許我適當地查看文件。我希望這可以爲別人節省一些痛苦和痛苦。我重寫了我的代碼17次以修復不存在的錯誤。