PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Auslesen einer Textdatei



MTS
18.03.2004, 18:58
Ich habe ein wahrscheinlich für erfahrene Java Menschen simples Problem...
Ich muss in meinem Projekt eine LinkedList abspeichern. Vom Prinzip her will ich das so haben, dass sie in 2 Schritten gespeichert wird:
(Die Liste enthält Objekte mit dem Attribut Name)
Erst wird eine Auflistung aller Namen, getrennt durch Simikola in eine Textdatei gespeichert. Danach werden alle Objekte eineln abgespeichert, mit dem jeweiligen "Name" als dateiname (+ Erweiterung).
Dieser Schritt geht auch soweit. Ob ich das geschickt gelöst habe weiss ich nicht. Ich bin noch neu in Java...
Das eigentlich Problem gibt es jetzt beim Auslesen. Und zwar bekomme ich dummerweise diese Textdatei nicht korrekt ausgelesen. Ich hab schon mehrere Versuche unternommen, die immer irgendwie gescheitert sind. Hier ersteinmal der code as is.

Das Abspeichern:


String filename = "/home/tobias/party.ser"; //sp?ter wird das hier Variabel ...

//1. Eine liste aller Member Namen speichern:
String MemberNames = "";
int i;
for (i = 0; i < Party.getMemberCount(); i = i + 1) {
MemberNames = MemberNames + Party.getMember(i).getName();
MemberNames = MemberNames + ";";
}

try
{
filename = "/home/tobias/" + Party.GetName() + ".dat";
FileOutputStream file = new FileOutputStream(filename);
DataOutputStream strm = new DataOutputStream(file);
//strm.writeUTF(MemberNames);
strm.writeBytes(MemberNames);
strm.close();
}
catch ( IOException e ) { System.err.println( e ); }


//2. Alle MemberObjekte Speichern!
for (i = 0; i < Party.getMemberCount(); i = i + 1) {
try
{
filename = "/home/tobias/" + Party.getMember(i).getName() + ".dat";
FileOutputStream file = new FileOutputStream( filename );
ObjectOutputStream o = new ObjectOutputStream(file);
o.writeObject( (Object) Party.getMember(i) );
o.close();
file.close();
}
catch ( IOException e ) { System.err.println( e ); }


}

}

Und mein Lesen Code

String MemberNames = "";
String filename = "/home/tobias/test.dat"; //Sp?ter Variabel ... test.dat existiert ;)
if (Party == null) {Party = new UParty("test"); }; // spaeter muss der PartyName irgendwo abgespeichert und hier geladen werden.
try
{


// Spaeter soll filename ausw?hlbar sein
filename = "/home/tobias/test.dat";

FileInputStream file = new FileInputStream( filename );

// DataInputStream strm = new DataInputStream(file);
// InputStreamReader strm = new InputStreamReader(file);
BufferedReader strm = new BufferedReader(new InputStreamReader(file));


char[] c;
c = new char[5];
strm.read(c);
MemberNames = new String(c);


if (MemberNames != "") {jLabel3.setText(MemberNames );} else {jLabel3.setText("Nope");} // just for testing.



}
catch ( IOException e ) { System.err.println( e ); }

//Die Membereinlesen:
String Membername = "";
int i = 0;
int k = 0;
Tmember temp;
String thename;


while (i < MemberNames.length() ) {
k = i;
while (MemberNames.charAt(k) != ';') {k = k +1;}
Membername = MemberNames.substring(i,k);
k = k + 1;
i = k ;
try {
thename = "/home/tobias/" + Membername + ".dat";

FileInputStream file = new FileInputStream(filename);
ObjectInputStream o = new ObjectInputStream(file);
// System.out.println(o.available());
temp = new Tmember();
temp = (Tmember) o.readObject();
Party.AddMember( temp );
o.close();
file.close();
}
catch ( IOException e ) { System.err.println( e ); }
catch ( ClassNotFoundException e ) { System.err.println( e ); }
}

RefreshList();
}



Ich wäre für Hilfe dankbar

Snieff
20.03.2004, 12:30
Hier nur ein paar Tips:
- Das Speichern des Namens würde ich mit nem BufferedWriter und einfach mit .write(String+"\n") machen, das einlesen kannst du dann sehr einfache mit einem String=BufferedReader.readLine machen.
- Suchen ins Strings mit indexOf, liefert der -1, dann nicht gefunden
Hier ginge auch ein StringTokenizer (Der Splittet strings nach einem bel. Trennzeichen und du kannst dann mit getNextToken() die einzelnen Teile bekommen)
- Casts nach Object kannst du dir sparen, jedes Objekt ist ein Object.

Ich hab nur ganz kurz über deinen Code geguckt, vielleicht helfen dir ja die Anregungen.

MTS
20.03.2004, 13:15
Ja danke. das geht tatsächlich ;)

Aber leider ergibt sich jetzt ein neues Problem...
Hier wird eine StreamCorruptedException mit der Meldung "Invalid Header" geworfen.
In der Beschreibung dazu steht auch nur dass die (gespeicherten) Daten fehlerhaft seien. Das kann aber eigentlich gar nicht sein ... Das entzieht sich völlig meiner Kennnis...


FileInputStream file = new FileInputStream(filename);
ObjectInputStream o = new ObjectInputStream(file);
// System.out.println(o.available());
temp = new Tmember();
temp = (Tmember) o.readObject();
Party.AddMember( temp );
o.close();
file.close();