Hi,
Ich schreibe einen Vokabeltrainer für das Schuljahr und möchte nun das er alle Vokabeln die hinzugefügt werden automatisch speichert. Dazu rufe ich die save() und read() Methoden auf.
Doch warum lädt er mir die Daten aus der XML Datei nicht in die Arraylist?
Code:
public static void read() {
try {
XMLDecoder de = new XMLDecoder(new BufferedInputStream(new FileInputStream("Datenbank.xml")));
Object result1, result2;
for(int i = 0; i < d.size(); i++) {
result1 = de.readObject();
result2 = de.readObject();
Db.add(result1.toString(), result2.toString());
}
de.close();
}
catch(Exception e) { }
}
ab jetzt für Tests immer hinzufügen (Faulheit lässt grüßen ) . ;-) - doch es gab auch keine Fehlermeldung aus --> somit besteht das Problem weiterhin. :/
Was auffällt: Du schreibt erst alle deutschen, dann alle englischen Wörter. Beim Lesen interpretierst Du dann aber die einzelnen Strings immer abwechselnd als deutsch und englisch.
Ja, stimmt, ich hab noch die alte Methode mit der Neuen vermischt, doch auch wenn er sie mir dann falsch einliest, bin ich schon glücklich.
Doch was ist an read() falsch? (bis auf das er es falsch einliest)
import java.util.ArrayList;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.beans.*;
import java.io.*;
public class Db {
static ArrayList<String> d = new ArrayList<String>();
static ArrayList<String> e = new ArrayList<String>();
public static void add(String deutsch, String englisch) {
d.add(deutsch);
e.add(englisch);
}
public static void remove(int index) {
d.remove(index);
e.remove(index);
}
public static String getIndexD(int index) {
return d.get(index);
}
public static String getIndexE(int index) {
return e.get(index);
}
public static int size() {
return d.size();
}
public static void save() {
try {
XMLEncoder en = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("Datenbank.xml")));
en.writeObject(d);
en.writeObject(e);
en.close();
}
catch(Exception e) { e.printStackTrace(); }
}
public static void read() {
try {
XMLDecoder de = new XMLDecoder(new BufferedInputStream(new FileInputStream("Datenbank.xml")));
d = (ArrayList<String>) de.readObject();
e = (ArrayList<String>) de.readObject();
de.close();
}
catch(Exception e) { e.printStackTrace(); }
}
public void print() {
for(int i = 0; i < d.size(); i++) {
System.out.println(d.get(i) + " - " + e.get(i));
}
}
/**Test**/
public static void main(String[] args)
{
Db db = new Db();
db.add("Flasche", "bottle");
db.add("Bier", "beer");
db.add("Tastatur", "keyboard");
db.save();
d = new ArrayList<String>();
e = new ArrayList<String>();
Db db2 = new Db();
db2.read();
db2.print();
}
}
Aber insgesamt wäre es besser, wenn du eine eigene Klasse Vokabel anlegen würdest! Dann hättest du genau eine Liste und keine Probleme durch falsche Zuordnungen.
Und falls du mehrer Vokabel-Listen anlegen willst wäre es verdammt sinnvoll, die Variablen und Methoden nicht statisch zu machen.
Code:
import java.util.ArrayList;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.beans.*;
import java.io.*;
public class Db {
ArrayList<String> d = new ArrayList<String>();
ArrayList<String> e = new ArrayList<String>();
public void add(String deutsch, String englisch) {
d.add(deutsch);
e.add(englisch);
}
public void remove(int index) {
d.remove(index);
e.remove(index);
}
public String getIndexD(int index) {
return d.get(index);
}
public String getIndexE(int index) {
return e.get(index);
}
public int size() {
return d.size();
}
public void save() {
try {
XMLEncoder en = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("Datenbank.xml")));
en.writeObject(d);
en.writeObject(e);
en.close();
}
catch(Exception e) { e.printStackTrace(); }
}
public void read() {
try {
XMLDecoder de = new XMLDecoder(new BufferedInputStream(new FileInputStream("Datenbank.xml")));
d = (ArrayList<String>) de.readObject();
e = (ArrayList<String>) de.readObject();
de.close();
}
catch(Exception e) { e.printStackTrace(); }
}
public void print() {
for(int i = 0; i < d.size(); i++) {
System.out.println(d.get(i) + " - " + e.get(i));
}
}
/**Test**/
public static void main(String[] args)
{
Db db = new Db();
db.add("Flasche", "bottle");
db.add("Bier", "beer");
db.add("Tastatur", "keyboard");
db.save();
Db db2 = new Db();
db2.read();
db2.print();
}
}
...überleg dir das mit der Vokabel-Klasse !
EDIT: Ach ja:
1. deine print()-Methode war falsch!
2. d.size() ist 0,wenn du das erste mal einliest (noch nix drin) - deshalb list du auch 0 Objekte ein. Alternativ:
Vielleicht solltest Du die Länge auch noch in der Datei speichern, dann kannst Du auch Dateien einlesen, ohne dass die Liste vorher schon da in der passenden Größe existieren muss.