Неполные строки записываются в txt файл при закрытии файла - Android

Приложение записывает данные датчика и записывает данные в файл .txt на SD-карту телефона.

В процессе сбора данных можно в любой момент нажать кнопку остановки, чтобы прекратить запись.

Соответствующая письменная часть выглядит следующим образом:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

import android.widget.CheckBox;
import android.widget.EditText;

public class DataCollector {

    File myFile;
    FileOutputStream fOut;
    OutputStreamWriter myOutWriter;
    BufferedWriter myBufferedWriter;
    PrintWriter myPrintWriter;

    private boolean isStamped;
    private int timeStampNo;

    boolean accelerationWanted;
    boolean rotationRateWanted;
    boolean magneticFieldWanted;

    // constructor
    public DataCollector() {

        isStamped = false;
        timeStampNo = 0;

        accelerationWanted = false;
        rotationRateWanted = false;
        magneticFieldWanted = false;
    }

    public void setStamp() {

        isStamped = true;
        timeStampNo++;
    }

    public void setFilePath(EditText txtName) {

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

        try {
            myFile.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            fOut = new FileOutputStream(myFile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

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

    }

    public void saveData(double[] acceleration, double[] rotationRate, double[] magneticField, long startTime, long currentTime) {

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

    public void stopSaving() {

        try {
            myOutWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
        try {
            fOut.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (NullPointerException e) {
            e.printStackTrace();
        }

    }

}

Независимо от того, в какой последовательности я вызываю saveData () и stopSaving (), последняя строка всегда остается неполной. По праву в основном занятии я делаю следующее:

dataCollector.saveData();
dataCollector.stopSaving();

Я сохраняю данные СНАЧАЛА, а ЗАТЕМ перестаю сохранять. Почему последняя строка ВСЕ ЕЩЕ НЕ ЗАВЕРШЕНА?

Есть идеи, как это решить? Либо сделайте последнюю строку завершенной, либо откажитесь от нее.

Заранее спасибо!


person Sibbs Gambling    schedule 18.06.2013    source источник


Ответы (2)


Попробуйте промыть перед закрытием:

public void stopSaving() {

    try {
        myPrintWriter.flush();
        myPrintWriter.close();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (NullPointerException e) {
        e.printStackTrace();
    }
    try {
        myOutWriter.flush();
        myOutWriter.close();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (NullPointerException e) {
        e.printStackTrace();
    }
    try {
        fOut.flush();
        fOut.close();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (NullPointerException e) {
        e.printStackTrace();
    }

}
person PX Developer    schedule 18.06.2013
comment
Описание функции сброса: Гарантирует, что все ожидающие данные отправлены адресату. Я думал, что это решит :( - person PX Developer; 18.06.2013
comment
Где закрыть myPrintWriter? - person PX Developer; 18.06.2013
comment
упс ... Я его вообще не закрывала! Но разве это имеет значение? Если да, то где его закрыть? - person Sibbs Gambling; 19.06.2013
comment
В saveData вы используете myPrintWriter для записи, поэтому я думаю, вам следует очистить его и закрыть тоже. Вы можете сделать это внутри stopSaving (я добавил это в код выше). Попробуйте, если это решит проблему. - person PX Developer; 19.06.2013

вы должны очистить свой объект записи перед тем, как закрыть его.

как показано ниже:

    myOutWriter.flush();
    myOutWriter.close();

а также

    fOut.flush();
    fOut.close();
person Sagar Maiyad    schedule 18.06.2013