Brauche Hilfe beim Programmieren: beim Speichern in eine TXT Datei werden die alten Daten immer durch neue überschrieben

  • Antworten:15
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 236

08.01.2013 01:27:14 via Website

Hallo!
Ich habe folgendes Problem:
ich will eine Reihe an Daten in eine TXT Datei speichern. Das Speichern an sich funktioniert auch. Aber wenn ich erneut speichere, werden die alten Daten mit den neuen überschrieben. Ich will aber, dass alle Daten erhalten bleiben.
Hier ist mein Quellcode:

1private final String DATEINAME = "daten.txt";
2 private final String VERZEICHNISNAME = "daten";
3 private File verzeichnis;
4 private File datei;

1verzeichnis = getDir(VERZEICHNISNAME, MODE_PRIVATE);
2 datei = new File(verzeichnis, DATEINAME);

1public void saveStart(final View View) {
2 try {
3 FileOutputStream fileOut = new FileOutputStream(datei);
4 dateiSpeichern(fileOut);
5 Toast.makeText(this, "gespeichert", Toast.LENGTH_LONG).show();
6 } catch (FileNotFoundException e) {
7 e.printStackTrace();
8 }
9}
10 private void dateiSpeichern(FileOutputStream fileOut) {
11 OutputStreamWriter writer = new OutputStreamWriter(fileOut);
12 String text =
13 " **** Start block: " +
14 savename.getText().toString() +
15 " = " +
16 text_1.getText().toString() +
17 ": " +
18 text_2.getText().toString() +
19 "; " +
20 text_3.getText().toString() +
21 ": " +
22 text_4_ausgabe.getText().toString() +
23 "; " +
24 text_5.getText().toString() +
25 ": " +
26 text_6.getText().toString() +
27 "; " +
28 text_7.getText().toString() +
29 ": " +
30 text_8.getText().toString() + " :End block **** ";
31 try {
32 writer.write(text);
33 } catch (IOException e) {
34 e.printStackTrace();
35 }finally {
36 if (writer != null) {
37 try {
38 writer.close();
39 } catch (IOException e) {
40 e.printStackTrace();
41 }
42 }
43 }

Was mache ich denn falsch, und was kann ich tun damit die Daten nicht überschrieben, sondern mutgespeichert werden?
Danke im Voraus!
Gelöschter Account
  • Forum-Beiträge: 802

08.01.2013 01:35:58 via App

boah viel spass

SONY XPERIA Z2 Stock 4.4.4 No Root
SONY XPERIA S Stock 4.1.2 Root/not work
SAMSUNG GALAXY NOTE 4 Stock 5.0.1 Root
SAMSUNG GALAXY S5 Stock 5.0 No Root
HTC One M8 Stock 5.0.1 No Root
APPLE iPHONE 5 Jailbreak Cydia :D
iPad 3 WiFi + Cellular IOS 8 No Jalbreak :(

  • Forum-Beiträge: 304

08.01.2013 02:33:28 via Website

Wenn die neue Datei den gleichen Namen hat wie die alte wird diese natürlich überschrieben...

Bevor du der Variable text den ganzen Speichertext zuweist, lies die alte Datei aus mit nem FileInputReader und setzte text = (alteTextDatei)
D.h. lies die alte Textdatei aus und speichere diese in der text Variable !

Danach machst du dann text = text + " **** Start block: " +...........................

— geändert am 08.01.2013 02:34:20

  • Forum-Beiträge: 236

08.01.2013 02:51:04 via Website

OK, danke!
Soll ich eventuell noch abfragen, ob die Datei existiert
1datei.exists()
?
Gelöschter Account
  • Forum-Beiträge: 5.215

08.01.2013 07:54:56 via Website

Logisch das die bestehende Datei überschrieben wird, es funktioniert wie definiert.

Siehe: http://developer.android.com/reference/java/io/FileOutputStream.html

Verwende: FileOutputStream (File file, boolean append) also in Deinem Fall konkret: FileOutputStream fileOut = new FileOutputStream(datei,true);

Dann wird auch nicht überschrieben, sondern appended!

lg Voss

  • Forum-Beiträge: 236

08.01.2013 10:18:51 via Website

@Jörg Voss
Vielen Dank! Werde es später ausprobieren!
Ich bin schon langsam am verzweifeln: das mit dem Datei Auslesen und in ein String Umwandeln klapp bei mir irgendwie nicht :(
Jetzt werde ich Nachmittags das versuchen.... Danach gebe ich eine Rückmeldung.
Danke.
  • Forum-Beiträge: 236

08.01.2013 12:32:31 via Website

JA, es funktioniert!!! :grin::grin::grin:
Danke noch Mal!
Aber ich habe noch eine Frage :grin: :
gibt es eventuell Möglichkeiten den in eine TextView ausgegebenen Text
1load.setText(text);
zu formatieren, damit es besser aussieht?

— geändert am 08.01.2013 12:49:19

  • Forum-Beiträge: 307

09.01.2013 16:39:02 via Website

Hi Sam Browder,

du kannst doch die TextView "formatieren".

Beispiel:
1<TextView
2 android:textColor="@color/black"
3 android:text="Das ist mein Text"
4 android:textStyle="bold"
5 android:textSize="14sp"
6 android:typeface="sans"
7 android:shadowColor="@color/red"
8 ...
9 />

mfg Christian

— geändert am 09.01.2013 16:39:42

www.apps-mit-web.de

  • Forum-Beiträge: 236

09.01.2013 17:05:37 via Website

Hi Christian Hempe,

Ja, aber das habe ich nicht gemeint :grin:. Die XML Formatierung habe ich gemacht.
Die geladenen Daten werden bei mir in der TextView zusammen angezeigt: "TextTextTextTextTextTextText".
Wenn ich aber die TXT Datei mit einem Texteditor aufmache, werden die Daten geordnet angezeigt - jeder Text in eigener Zeile:
"Text
Text
Text
Text
Text"
Genau das will ich beim Anzeigen der geladenen Daten in der TextView erreichen, und das muss man glaube ich in der Activity programmieren - mit XML kommt man da nicht weit...

MfG
Sam
  • Forum-Beiträge: 304

09.01.2013 17:48:44 via Website

kalr bei jedem Hinzufügen von neuem Text setzt du einfach ein \n , was ein Zeilenumbruch zur Folge hat
  • Forum-Beiträge: 236

09.01.2013 18:10:15 via Website

Klar, beim hinzufügen....
Aber wie ist es denn beim auslesen von Text in eine TextView:
1public void loadStart(final View View) {
2 try {
3 FileInputStream fileIn = new FileInputStream(datei);
4 dateiLaden(fileIn);
5 } catch (FileNotFoundException e) {
6 e.printStackTrace();
7 }
8 }
9 private void dateiLaden(FileInputStream fileIn) {
10 BufferedReader fileInBuffer = new BufferedReader(new InputStreamReader(fileIn));
11 String text = "";
12 String zeile;
13 try {
14 while ((zeile = fileInBuffer.readLine()) != null) {
15 text += zeile;
16 }
17 } catch (IOException e) {
18 e.printStackTrace();
19 } finally {
20 try {
21 fileInBuffer.close();
22 } catch (IOException e) {
23 e.printStackTrace();
24 }
25 }
26 load.setText(text);
27 }
?
Denn ich will, dass der Text hier auch mit Zeilenumbrüchen angezeigt wird.
Gelöschter Account
  • Forum-Beiträge: 5.215

09.01.2013 18:46:16 via Website

Zum einen würde ich grundsätzlich bei solchen Dingen wir dem Einlesen von Dateien, die ja auch mal größer sein können keine Methodik verwenden wie:

String text = "";
try {
while ((zeile = fileInBuffer.readLine()) != null) {
text += zeile;
}

Sondern:
StringBuilder text = new StringBuilder();
try {
while ((zeile = fileInBuffer.readLine()) != null) {
text.append(zeile);
text.append("\n"); //<-- Hier fügst Du einen Zeilenumbruch zu.
}

Warum diese Methode mit StringBuilder ? Weil sie etwa um den Faktor 400 schneller ist als die von Dir gewählte Variante. Das macht sich in Summe beim Einlesen längerer Texte Extrem bemerkbar.

lg Voss