Daten speichern/auslesen

F

Fujit

Neues Mitglied
0
Hallo zusammen,
ich versuche mittels Json Daten zu speichern und danach auszulesen.

Leider klappt das nicht. Und ich weiss nicht genau, ob ich beim Schreiben scheitere oder beim lesen oder beim beiden^^.
Mein Code:
Code:
class myClass{
static File file = new File(f.getAbsolutePath()+"meineApp.txt");			
static FileOutputStream oStream = new FileOutputStream(file);
static OutputWriter writer = new OutputStreamWriter(fileOStream);			
static JSONArray jsonArray  = new JSONArray();
static JSONObject  jsonObct = new JSONObject();

public static void persistData(ArrayList<String> values){

	for (int i = 0; i < buttons.size(); i++) {
		lstButtons.get(i));			
		jsonObct.put("wert", values.get(i).getText().toString());
		jsonArray.put(jsonObct);
	}			
	outputWriter.append(jsonArray.toString());
	outputWriter.close();
	fileOStream.close();
}

public static ArrayList<String> getValues(){		
	ArrayList<String> buttonCaptions = new ArrayList<String>();
	String dataLine = "";						
	bufferReader = new BufferedReader(new FileReader(file));	
			
	while ( bufferReader.readLine()!=null) {
          
		dataLine += bufferReader.readLine();
				
	}
}
}

1. Erster Fehler:
Annahme: Daten sind geschrieben worden
Das erste mal beim Eintritt in "getValues" sollten die daten im bufferReader da sein, sprich, er geht in die while-schleife rein. Das tut er aber nicht.

2. Zweiter Fehler:
Während ich die App ausführe und danach irgendwann "persistData" ausführe, dann läuft sie problemlos durch.
Immer noch während der Ausführung trete ich das zweite mal in "getValues" und stelle folgendes Verhalten fest:

Er geht in die Schleife rein.
Beim Debuggin sehe unter dem Untereintrag von bufferReader "buf" die Arrayfelder von 0 bis 99. Und unter dem ersten Feld von 0 bis 99 sehe ich tatsächlich einzelne Zeichen.
Dann geht er in die Schleife rein und führt "readLine()" und er gibt mir "null" zurück.

Wahrscheinlich überschreibe ich "meineApp.txt" wenn ich das aller ersten (und einzigen) mal mein statisches Object instanziere. Sonst würde ich diese Zeichen auch beim ersten Eintritt in "getValues" sehen und er würde in die Schleife reingehen, was er nicht tut.

Und wieso er mir beim zweiten Eintritt in die "getValues" die Zeichen, die ich bei der Appausführung eben angelegt habe zwar anzeigt aber mit "readline()" nicht zurückgibt, verstehe ich nicht.

Danke für jeden Tipp.
 
Dir ist aber klar, dass du nur jede zweite Zeile zu "dataLine" hinzufügst? Du liest jedes mal, wenn die While-Bedingung geprüft wird, eine Zeile. Mit dieser machst du aber nichts. In der While-Schleife wird dann nochmal eine Zeile gelesen, die du dann weiterverwendest.

Und: Statt String-Verkettung zu verwenden, solltest du auf StringBuilder ausweichen.

Probier das getVaules mal so:
Code:
public static ArrayList<String> getValues(){		
	ArrayList<String> buttonCaptions = new ArrayList<String>();
	String dataLine = "";
	StringBuilder dataBuilder = new StringBuilder();

	bufferReader = new BufferedReader(new FileReader(file));	
			
	while ( dataLine = bufferReader.readLine() != null) {
		dataBuilder.append(dataLine);
	}

	// wenn alles unbedingt in dataLine stehen soll, dann Kommentar in nächster Zeile entfernen
	// dataLine = dataBuilder.toString();

	// ... was auch immer du mit den Daten machen möchtest

	return buttonCaptions;
}


Weitere Anmerkung:
Wieso legst du FileOutputStream, OutputWriter als statische Variablen in der Klasse an und nicht als lokale, wenn du sie auch benötigst (in persistData())? In persistData schließt du sie, ein erneutes öffnen (falls du nochmal persistData aufrufst), sehe ich nicht. Das dürfte nicht klappen. Das dürfte auch dein Überschreib-Problem erklären.
 
vielen Dank! hab alles so umgesetzt.
Es funktioniert soweit :)
Ich hab noch nicht so viel zu tun mit java-stream.
Mir war ersichtlich, dass er mit "readLine" ließt, aber irgendwie hab ich angenommen, dass beim nächsten Aufruf von Readline ich das herauslesen kann, obwohl ich (vorerst) nur eine Zeile hab :biggrin:

Eine Frage hätte ich noch.
Wenn meine App gestartet wird.
Und eine txt-Datei bereits vorhanden ist.
Überschreibe ich sie nicht mit:

Code:
file = new File(file.getAbsolutePath()+"meineDatei.txt");
Und wenn doch, wollte ich auf "if.exists" prüfen, aber dafür benötige ich auch dieses "file"-Objekt.
Wie hier im kurzen Beispiel:

Code:
File f = new File(file.getAbsolutePath()+"meineDatei.txt");
if(f.exists()){
    //ist vorhanden
}
Ich will letztendlich nur dann ein File anlegen, wenn er auch nicht da ist. Wenn er da ist, möchte ich ihn einfach verwenden.

Danke noch mal.
 
Also mit Instanziieren der Klasse File wird die Datei nicht überschrieben oder geöffnet. Das erfolgt bei dir durch den FileOutputStream. Diesem kannst du ja als Parameter übergeben, ob die Datei neu angelegt oder ob an die bestehende angehängt werden soll.
 
Nun habe ich noch ein Problem mit dem JSONArray.
Es gibt einen Konstruktor von ihm, der einen String annimmt.
Der String, den ich ursprünglich herauslese sieht so aus:

{"name":"meinName: Ralf\n0.00€"}
Der Konstruktor wirft laut der Doku nur die JSONException.
Diese kann nur geworfen werden, wenn ein Syntax-Fehler besteht.
Ich dachte zuerst, es kommt wegen dem "\n".
So habe ich einen String erstellt:
{"name":"meinName: Ralf:0.00€"}

Also kann es an "\n" nicht liegen.
Ich wüsste nicht, wieso der String falsch sein soll, denn er ursprünglicher String, den ich zuerst gezeigt habe wurde von:

Code:
outputWriter.append(jsonArray.toString());
problemlos festgeschrieben.
Aber beim Auslesen von diesem String kriege ich eben Probleme:

Code:
String meinString = bufferReader.readLine();
JSONArray jsonArray = new JSONArray(meinString);
//Inhalt von "meinString": {"name":"meinName: Ralf\n0.00€"}

Danke für jeden Tipp.

Nachtrag.
Ich habe es behoben und zwar hab ich diesen StringBuilder verwendet, wie du es mir geraten hast.
Ich kanns mir aber nicht erklären, wieso der StringBuilder es schafft einen JSONArray zu erzeugen.
Was mir aber aufgefallen ist dass mir vorher eine eckige Klammer ganz vorne gefällt hat und mit dem StringBuilder ist sie da.
Wie gesagt, hab ich diese Daten ebenfalls mit dem JSONArray.ToSting() gespeichert, daher bin ich ausgegangen, dass das ok ist, wenn die eckige Klammer ganz Vorne fällt.
 
Zuletzt bearbeitet:

Ähnliche Themen

A
Antworten
10
Aufrufe
1.940
swa00
swa00
H
Antworten
2
Aufrufe
1.315
Hcman
H
B
Antworten
6
Aufrufe
1.059
jogimuc
J
Zurück
Oben Unten