in txt datei schreiben

J

jim

Ambitioniertes Mitglied
0
Hallo liebesForum,

ich weis das dieses thema schon oft dikutiert wurde aber irgendwie komm ich trotzdem nicht weiter. ich möchte txt in einer Datei speichern aus meiner app heraus(highscore liste eines spiels) ich benutze folgenden Code
PHP:
public void writeToFile(String toWrite){
        
        char[] buf = new char[toWrite.length()];
        for(int i = 0; i < toWrite.length();i++){
            buf[i] = toWrite.charAt(i ); 
            }
        
        try {
    
            FileOutputStream fOut;
            String jv = (String)Environment.getExternalStorageDirectory().getPath();
            fOut =  _context.openFileOutput(jv,_context.MODE_PRIVATE);
             ObjectOutputStream oos = new ObjectOutputStream(fOut);
                oos.writeObject(buf); 
                oos.close();

            } catch (java.io.IOException e) {
              //do something if an IOException occurs.
            }
    }

Hier bekomme ich eine fehlermeldung wobei er den relativen und nicht den absoluten pfad haben möchte. Kann mir da jemand weiter helfen?

LG Jim
 
Ich tu das einfacher so:

Code:
BufferedWriter out = null;
try {
	out = new BufferedWriter(new FileWriter("/sdcard/meinFile.txt"));
        out.write(meinInhalt);
        out.close();
      } catch (Exception e) { //fehlende Permission oder sd an pc gemountet}
 
  • Danke
Reaktionen: jim
Oder so:

PHP:
FileOutputStream out = new FileOutputStream(new File("whereever/txt.txt"));
out.write(inhaltsString.getBytes());
out.close;
 
hey, ja vielen dank klappt wunderbar,nun überschreibe ich aber jedesmal die Datei. Wie stelle ich es am besten an wenn ich nur was anfügen möchte, oder sollte ich(da es sich eh um ein highscore handelt) erst auslesen, einsortieren und dann schreiben??.

LG Jim
 
Auslesen, einsortieren und schreiben, finde ich am einfachsten und mir ist jetzt auch keine andere Methode bekannt.
 
Für Highscores eignet sich auch ein Serialisierbares Objekt. Bspw:
Code:
public class Highscores implements Serializable {
  private static final int MAX_HIGHSCORES = 10;
  private String[] mNames = new String[MAX_HIGHSCORES];
  private int[] mScores  = new int[MAX_HIGHSCORES];
  // Methoden zum setzen und lesen der Highscores
  /*
  ...
  */
}
 
Hallo,

ich habe auch eine Frage zum selben Thema. Mein Programm liest ständig die Daten vom beschleunigungssensor aus und gibt sie in Textfeldern aus. Jetzt sollen die Werte in einer Datei gespeichert werden.

Aber ich schaffe nur den ersten Wert zu speichern, weil ich nicht weiß wo mein Programm zu Ende ist, allerdings muss ich ja mein "close" ans Ende des Programms setzen ...

Könnte mir jemand erklären was ich dabei beachten muss, leider habe ich den Code nicht auf diesem Computer, aber wenn nötig poste ich ihn später.

mfg
 
Nimm flush() statt close() oder öffne die Date zum "anhängen" vor jedem Schreiben und mache dann direkt close(). Min. eins davon müsste gehen.
 
Hallo, ich nehme immer flush und danach close, macht man das nicht so?

Hier ist mein bisheriger Code. Wäre nett wenn sich den mal kurz jemand ansehen könnte. Ich darf die Datei nur einmal öffnen und nicht jedes mal wenn wieder was reingeschrieben wird. Die Werte die ich schreiben möchte kommen im millisekunden Takt.

Code:
package com.paad.forceometer;

import java.util.Timer;
import java.util.TimerTask;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.text.*;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class Forceometer extends Activity {
    SensorManager sensorManager;
    TextView accelerationTextView;
    TextView maxAccelerationTextView;
    TextView accelerationXTextView;
    TextView accelerationYTextView;
    TextView accelerationZTextView;
    TextView accelerationXTextViewm;
    TextView accelerationYTextViewm;
    TextView accelerationZTextViewm;
    TextView accelerationLeftTextView;
    TextView accelerationRightTextView;
    double currentAcceleration = 0;
    double maxAcceleration = 0;
    float u = 0;
    float h = 0;
    File gpxfile;
    float r = 0;
    ProgressBar myProgressBar;
    ProgressBar myProgressBarL;
    String ax, ay;
    FileWriter writer = null;

    float calibrateX, calibrateY, calibrateZ, z, y, x, cHx, cHy, cHz,
            accLeftRight, gy, gx, gz;
    private Button reset;
    private Button calibrate;
    DecimalFormat f = new DecimalFormat("#0.00");

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);

        accelerationXTextView = (TextView) findViewById(R.id.accelerationX);
        accelerationYTextView = (TextView) findViewById(R.id.accelerationY);
        accelerationLeftTextView = (TextView) findViewById(R.id.accelerationLeft);
        accelerationRightTextView = (TextView) findViewById(R.id.accelerationRight);
        accelerationZTextView = (TextView) findViewById(R.id.accelerationZ);
        accelerationXTextViewm = (TextView) findViewById(R.id.accelerationXm);
        accelerationYTextViewm = (TextView) findViewById(R.id.accelerationYm);
        accelerationZTextViewm = (TextView) findViewById(R.id.accelerationZm);
        myProgressBar = (ProgressBar) findViewById(R.id.progressbar_Horizontal);
        myProgressBar.setMax(100);

        // Calibrate
        this.calibrate = (Button) this.findViewById(R.id.calibrate);
        this.calibrate.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                calibrateX = cHx;
                calibrateY = cHy;
                calibrateZ = cHz;
            }
        });

        // Reset
        this.reset = (Button) this.findViewById(R.id.reset);
        this.reset.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                u = 0;
                h = 0;
                r = 0;
            }
        });

        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

        Sensor accelerometer = sensorManager
                .getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorManager.registerListener(sensorEventListener, accelerometer,
                SensorManager.SENSOR_DELAY_FASTEST);

        Timer updateTimer = new Timer("gForceUpdate");
        updateTimer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                updateGUI();
            }
        }, 0, 5000);
        try {
            writer = new FileWriter(gpxfile);
            writer.flush();
            writer.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    private final SensorEventListener sensorEventListener = new SensorEventListener() {
        float calibration = SensorManager.STANDARD_GRAVITY;

        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }

        public void onSensorChanged(SensorEvent event) {
            x = event.values[0];
            y = event.values[1];
            z = event.values[2];

            cHx = event.values[0];
            cHy = event.values[1];
            cHz = event.values[2];

            accLeftRight = ((y - calibrateY) / calibration);

            x = Math.abs((x - calibrateX) / calibration);
            y = Math.abs((y - calibrateY) / calibration);
            z = Math.abs((z - calibrateZ) / calibration);

        }
    };

    private void generateCsvFile(String sFileName) {

        boolean exists = (new File("test1.txt")).exists();
        try {

            if (!exists) {
                File root = Environment.getExternalStorageDirectory();
                gpxfile = new File(root, sFileName);
                writer = new FileWriter(gpxfile);
                exists = true;
            }
            if (exists) {
                writer = new FileWriter(gpxfile);
                writer.append(ax);
                writer.append("\n");

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void updateGUI() {
        runOnUiThread(new Runnable() {
            public void run() {

                if (accLeftRight > 0) {
                    String accLeftRightS = f.format(Math.abs(accLeftRight))
                            + " rechts";
                    accelerationRightTextView.setText(accLeftRightS);
                    accelerationRightTextView.invalidate();
                }
                if (accLeftRight < 0) {
                    String accLeftRightS = f.format(Math.abs(accLeftRight))
                            + " links";
                    accelerationLeftTextView.setText(accLeftRightS);
                    accelerationLeftTextView.invalidate();
                }

                if (y > u) {
                    u = y;
                    String maxY = f.format(u) + " max y";
                    accelerationYTextViewm.setText(maxY);
                    accelerationYTextViewm.invalidate();
                }
                if (z > h) {
                    h = z;
                    String maxZ = f.format(h) + " max z";
                    accelerationZTextViewm.setText(maxZ);
                    accelerationZTextViewm.invalidate();
                }
                if (x > r) {
                    r = x;
                    String maxX = f.format(r) + " max x";
                    accelerationXTextViewm.setText(maxX);
                    accelerationXTextViewm.invalidate();
                }

                ax = f.format(x) + " x";
                accelerationXTextView.setText(ax);
                accelerationXTextView.invalidate();
                ay = f.format(y) + " y";
                accelerationYTextView.setText(ay);
                accelerationYTextView.invalidate();
                String az = f.format(z) + " z";
                accelerationZTextView.setText(az);
                accelerationZTextView.invalidate();
                myProgressBar.setProgress((int) (y * 100));
                generateCsvFile("test1.txt");
            }
        });
    };
}
 
Wieso willste ie ganze Zeit die Werte in einer Txt drin haben...
einmal am Ende reinschreiben sollte doch reichen.
 
Meinst du ich soll die ganzen Werte erst in ein Array speichern und dann erst das Array in die txt Datei?

Ich brauche ja die Werte über die ganze Zeit, gemessen wird während einer Autofahrt.
 
wenn du die werte in nem arry hälst sind sie im ram.
Wenn du sie in ner .txt speicherst sind sie im flash.

Vom flash lesen ist doch viel langsamer, vom Schreiben brauchen wir nicht erst reden. ;)
 
Also ich erläutere nochmal das Problem kurz.

Ich will eine Testfahrt mit meinem Auto machen und die Entwirklung des G-Kraft Verlaufs in einer TXT Datei speichern. Damit ich später eine "virtuelle" Testfahrt machen kann indem ich nurnoch die entstandene Datei durchgehe.

Aber erstes Problem.

Das Array ist begrenzt und kann nicht beliebig groß werden so wie bei JavaScript, wo ich ein Array festlege und die Größe ist noch nicht sicher.

Zweites Problem.

Ich suche Gedade eine möglichkeit das ganze dann in die Textdatei zu speichern, aber irgendwie bekomme ich es gerade nochnicht hin das erstellte array in die Datei zu speichern.

Drittes Problem.

Wann in meinem Programmcode rufe ich die Methode auf die die Datei speichert? Muss ich dazu einen Button Klick verwenden oder gibt es auch ein "Programmende" an dem das geschieht?


Hab das Programm jetzt umgeschrieben, aber es ist sau langsam und stürzt dann ab, obwohl ich die Daten erst in die Datei schreiben will wenn ich den "Reset" Button betätige...

Code:
package com.paad.forceometer;

import java.util.Timer;
import java.util.TimerTask;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.text.*;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class Forceometer extends Activity {
    SensorManager sensorManager;
    TextView accelerationTextView;
    TextView maxAccelerationTextView;
    TextView accelerationXTextView;
    TextView accelerationYTextView;
    TextView accelerationZTextView;
    TextView accelerationXTextViewm;
    TextView accelerationYTextViewm;
    TextView accelerationZTextViewm;
    TextView accelerationLeftTextView;
    TextView accelerationRightTextView;
    double currentAcceleration = 0;
    double maxAcceleration = 0;
    float u = 0;
    float h = 0;
    File gpxfile;
    String[] names = new String[100];
    float r = 0;
    ProgressBar myProgressBar;
    ProgressBar myProgressBarL;
    int iterator = 0;
    String ax, ay;
    FileWriter writer = null;

    float calibrateX, calibrateY, calibrateZ, z, y, x, cHx, cHy, cHz,
            accLeftRight, gy, gx, gz;
    private Button reset;
    private Button calibrate;
    DecimalFormat f = new DecimalFormat("#0.00");

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);

        accelerationXTextView = (TextView) findViewById(R.id.accelerationX);
        accelerationYTextView = (TextView) findViewById(R.id.accelerationY);
        accelerationLeftTextView = (TextView) findViewById(R.id.accelerationLeft);
        accelerationRightTextView = (TextView) findViewById(R.id.accelerationRight);
        accelerationZTextView = (TextView) findViewById(R.id.accelerationZ);
        accelerationXTextViewm = (TextView) findViewById(R.id.accelerationXm);
        accelerationYTextViewm = (TextView) findViewById(R.id.accelerationYm);
        accelerationZTextViewm = (TextView) findViewById(R.id.accelerationZm);
        myProgressBar = (ProgressBar) findViewById(R.id.progressbar_Horizontal);
        myProgressBar.setMax(100);

        // Calibrate
        this.calibrate = (Button) this.findViewById(R.id.calibrate);
        this.calibrate.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                calibrateX = cHx;
                calibrateY = cHy;
                calibrateZ = cHz;
            }
        });

        // Reset
        this.reset = (Button) this.findViewById(R.id.reset);
        this.reset.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                u = 0;
                h = 0;
                r = 0;

                generateCsvFile("felixtest.csv");
            }
        });

        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

        Sensor accelerometer = sensorManager
                .getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorManager.registerListener(sensorEventListener, accelerometer,
                SensorManager.SENSOR_DELAY_FASTEST);

        Timer updateTimer = new Timer("gForceUpdate");
        updateTimer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                updateGUI();
            }
        }, 0, 20);
    }

    private final SensorEventListener sensorEventListener = new SensorEventListener() {
        float calibration = SensorManager.STANDARD_GRAVITY;

        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }

        public void onSensorChanged(SensorEvent event) {
            x = event.values[0];
            y = event.values[1];
            z = event.values[2];

            cHx = event.values[0];
            cHy = event.values[1];
            cHz = event.values[2];

            accLeftRight = ((y - calibrateY) / calibration);

            x = Math.abs((x - calibrateX) / calibration);
            y = Math.abs((y - calibrateY) / calibration);
            z = Math.abs((z - calibrateZ) / calibration);

        }
    };

    private void generateCsvFile(String sFileName) {

        File root = Environment.getExternalStorageDirectory();
        int i = 0;
        try {
            gpxfile = new File(root, sFileName);
            writer = new FileWriter(gpxfile);
            while (i < 100) {
                writer.append(names[i]);
                writer.append("\n");
                i++;
            }
            writer.flush();
            writer.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    private void updateGUI() {
        runOnUiThread(new Runnable() {
            public void run() {
                if(iterator<100){
                    iterator++;
                }
                
                if (accLeftRight > 0) {
                    String accLeftRightS = f.format(Math.abs(accLeftRight))
                            + " rechts";
                    accelerationRightTextView.setText(accLeftRightS);
                    accelerationRightTextView.invalidate();
                }
                if (accLeftRight < 0) {
                    String accLeftRightS = f.format(Math.abs(accLeftRight))
                            + " links";
                    accelerationLeftTextView.setText(accLeftRightS);
                    accelerationLeftTextView.invalidate();
                }

                if (y > u) {
                    u = y;
                    String maxY = f.format(u) + " max y";
                    accelerationYTextViewm.setText(maxY);
                    accelerationYTextViewm.invalidate();
                }
                if (z > h) {
                    h = z;
                    String maxZ = f.format(h) + " max z";
                    accelerationZTextViewm.setText(maxZ);
                    accelerationZTextViewm.invalidate();
                }
                if (x > r) {
                    r = x;
                    String maxX = f.format(r) + " max x";
                    accelerationXTextViewm.setText(maxX);
                    accelerationXTextViewm.invalidate();
                }

                ax = f.format(x) + " x";
                accelerationXTextView.setText(ax);
                accelerationXTextView.invalidate();
                ay = f.format(y) + " y";
                accelerationYTextView.setText(ay);
                accelerationYTextView.invalidate();
                String az = f.format(z) + " z";
                accelerationZTextView.setText(az);
                accelerationZTextView.invalidate();
                myProgressBar.setProgress((int) (y * 100));
                generateCsvFile("test1.txt");

                if (iterator < 100) {
                    names[iterator] = ax;
                }
            }
        });
    };
}
 
Zuletzt bearbeitet:
Achso, ok.
Dann müsstest du halt vor jedem Speichern die Datei erst einlesen, den alten Text in nem StringBuilder speichern, den neuen hinzufügen und dann speichern.
 
Problem ist jetzt, sobald ich das Array am Anfang zu groß mache Startet das Programm garnicht. Wenn ich das Array auf 100 begrenze läuft es, aber nur langsam ... zumindest speichert er mir aber die Werte nacheinander in meine Datei so wie ich will.

Was meinst du mit StringBuilder, bin leider nochtnicht so gut in Android ;)

Hab jetzt nachgeschaut was ein StringBuilder ist und probiers damit.


Also wenn ich durch einen String Builder einen rießen String erzeuge und den dann am Schluss auf einmal abspeichere wird das Programm nach Sekunden auch total langsam. =/
 
Zuletzt bearbeitet:
Also ich würde es erstmal einfach eine ArrayList soweit befüllen wies geht ;)
Brauchst du bei einer Autofahrt Daten in ms Abständen?

Du könntest zb 3 ArrayList<Float> haben und da kontinuirlich die Daten hinzufügen.
 
  • Danke
Reaktionen: felix123
Also ich glaub ich habs jetzt geschafft :) Ich probiers noch weiter aus.

Allerdings muss ich jetzt den Reset Button drücken um das ganze abzuspeichern bzw. die Datei zu schließen. Kann ich das auch anders lösen? Beim Beenden des Programms durch den Zurück Button auf dem Dell Streak soll automatisch die Datei geschlossen werden.
 
Zuletzt bearbeitet:
Hallo,

ich mache auch meine ersten Versuche mit Android und scheitere momentan daran, eine Datei auf der SD-Karte abzuspeichern.
Folgender Versuch:

Code:
String EXTERNAL_STORAGE = Environment.getExternalStorageDirectory().toString();
    		
    		BufferedWriter bw = new BufferedWriter(new FileWriter(EXTERNAL_STORAGE+"/"+"dateiname"));
bw.write(inhaltsstring);
bw.flush();
bw.close();
schlägt allerdings fehl. Die Datei lässt sich nicht auf der SD-Karte finden. Ich habe die Permission in die Manifest eingetragen.
Was mache ich falsch?

Vielen Dank!
 
Stürzt die App ab? Wenn ja, was steht in Logcat?
 
Nein, die App stürzt nicht ab. Wenn ich sie aber auf dem virtuellen Android-Gerät laufen lasse, steht im Logcat "Permission denied", obwohl ich die Erlaubnis in der Manifest angefordert habe.
 

Ähnliche Themen

S
Antworten
33
Aufrufe
2.518
Sempervivum
S
G
Antworten
8
Aufrufe
1.157
gnome2012
G
B
Antworten
4
Aufrufe
406
bb321
B
Zurück
Oben Unten