2011-12-14 4 views
1

В принципе, я пытаюсь захватить данные акселерометра в txt-файл. Код записывает данные ускорения в строку, а затем обновляет каждый раз, когда это часто изменяется. Я включил кнопку переключения, которая запускает регистрацию данных и должна записать ее в файл. это - то, где это становится странным. Код проверяет, существует ли файл уже, а затем добавляет номер в конец файла, чтобы убедиться, что он не перезаписывает старые данные. НО, он создает файл, полный мусора или поврежденных данных. Я проверил, что если файл уже существует, он будет записывать хорошие данные в файл, но если он должен создать файл, он создает поврежденный файл. Код показан ниже. Не знаю, что происходит с повреждением файла.Буферизованный 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Î & ¸ Œ- `Ид ïÇDêç³òß¼ ( 1th ˙U 'æÁ9Û ™ íb_CONSOLE · ÇZub ™

Дайте мне знать, что вы думаете.

ответ

1

У меня есть дроид X, и я обнаружил, что при подключении дроида x в качестве устройства хранения USB все, что создано и хранится на телефоне, является ENCRYPTED. Вот почему, когда я смотрел на данные, он оказался коррумпированным. когда я подключаю телефон в режиме ПК, он затем позволяет мне просматривать файлы соответствующим образом. Надеюсь, что это избавит кого-то еще от боли и агонии. Я переписал свой код 17 раз, чтобы исправить ошибку, которой не было.