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

  • Antworten:15
  • Bentwortet
Sam Browder
  • 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!

Antworten
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 :(

Antworten
Sam Browder
  • Forum-Beiträge: 236

08.01.2013, 01:47:23 via Website

Und was soll das heissen?

Antworten
Appsoluts
  • 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

Antworten
Sam Browder
  • 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()
?

Antworten
Appsoluts
  • Forum-Beiträge: 304

08.01.2013, 03:31:36 via Website

ja klar sonst bekommst du ne exception

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

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

AppsolutsRafael K.

Antworten
Sam Browder
  • 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.

Antworten
Sam Browder
  • 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

Antworten
Christian
  • 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

Antworten
Sam Browder
  • 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

Antworten
Appsoluts
  • 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

Antworten
Sam Browder
  • 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.

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

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

Sam Browder

Antworten
Sam Browder
  • Forum-Beiträge: 236

09.01.2013, 18:56:56 via Website

Ok. Danke für den Tip!!!

Antworten
Sam Browder
  • Forum-Beiträge: 236

09.01.2013, 19:08:47 via Website

Super! Funktioniert perfekt! :grin:
Danke noch Mal!

Antworten