 06.06.2008 09:16 Uhr
|
|
|
|
|
Dies ist der Code, mit dem ich die Daten in die Datei einlese: java:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| try {
File datei = new File("fahrzeug.dat");
RandomAccessFile ausgabe = new RandomAccessFile(datei, "rw");
System.out.println("Dateilänge" + ausgabe.length());
ausgabe.seek(ausgabe.length());
ausgabe.writeUTF(fullid);
ausgabe.writeUTF(marke);
ausgabe.writeUTF(typ);
ausgabe.writeUTF(berechtigung);
ausgabe.writeUTF(erstzulassung);
ausgabe.writeUTF(kaufpreis);
ausgabe.writeUTF(ladevolumen);
ausgabe.writeUTF(sitzplaetze);
ausgabe.writeUTF(leistung);
ausgabe.writeUTF(kilometerstand);
ausgabe.writeUTF(kraftstoff);
ausgabe.writeUTF(inspektion);
ausgabe.writeUTF(hu);
ausgabe.writeUTF(au);
ausgabe.writeUTF(versicherung);
ausgabe.writeUTF(kategorie);
ausgabe.writeUTF(parkplatz);
ausgabe.writeUTF(stellplatz);
ausgabe.writeUTF(schaden);
System.out.println("Dateilänge" + ausgabe.length());
ausgabe.close();
}
catch (IOException ex2) {
System.out.println("Fehler: "+e.toString());
} |
Unt dies ist der Code, mit dem ich Teile der Datei wieder auslesen möchte. java:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| String lastid = null;
try {
RandomAccessFile ausgabe = new RandomAccessFile("fahrzeug.dat", "rw");
if (ausgabe.length() <= 400) {
String s = ausgabe.readUTF();
lastid = s;
System.out.println(s);
}
else {
ausgabe.seek(ausgabe.length() - 400);
String s = ausgabe.readUTF();
lastid = s;
System.out.println(s);
}
ausgabe.close();
}
catch (IOException ex) {
System.out.println("Fehler: "+ex.toString());
} |
Mein Problem ist nun, dass die Ausgabe erst das richtige Ergebnis geliefert hat ("ID: 200806061") und jetzt auf einmal eine EOFException wirft.
Hat jemand eine Ahnung warum das so ist und wie ich das Problem lösen kann.
 2 mal bearbeitet
|
|
 06.06.2008 11:57 Uhr
|
|
|
|
|
Ist 400 die Laenge eines Datensatzes?
Warum liest du einen ganzen Datensatz, wenn die Laenge <= 400 ist?
In welcher Zeile tritt der Fehler ueberhaupt auf?
___________________________ "All input is evil, until proven otherwise" Michael Howard
|
|
 06.06.2008 12:27 Uhr
|
|
|
|
|
Welche UTF-Codierung verwendest du? Wenn ich diesem Link trauen darf, liest readUTF bis zu drei Byte aus. Hier wird es dein Programm schmeißen, da es wahrscheinlich eine Codierung einliest, die nicht in deinem File enthalten ist, und so ans Ende des Files kommt. Aus Empörung, dass da kein Zeichen aufs Einlesen wartet, wirft er die Exception.
 1 mal bearbeitet ___________________________ "Etre fort pour être utile" - Georges Hébert
|
|
 06.06.2008 13:01 Uhr
|
|
|
|
|
Poste mal bitte hier den Stacktrace. JAVA:1
2
3
4
| try {
} catch(Exception e) {
e.printStackTrace();
} |
Dann weiß man auch gleich mal, was genau die Exception auslöst.
___________________________ Visit: www.sim4000.de
Ein ball rollt um die Ecke und fällt um.
Intelligenz ist, wenn mein weiß, dass man doof ist.
|
|
 06.06.2008 14:04 Uhr
|
|
|
|
|
Hier erstmal der Stacktrace:
java.io.EOFException
at java.io.RandomAccessFile.readFully(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.RandomAccessFile.readUTF(Unknown Source)
at Fuhrpark.main(Fuhrpark.java:399)
Das der Fehler beim readUTF liegt wusste ich schon.
Allerdings verstehe ich nicht, warum er sagt, dass er das ausgelesene nicht kennt.
Es ist doch bereits als UTF in die Datei geschrieben worden.
Ausserdem hat ja der gleiche Code vorher noch funktioniert.
Die Länge ist etwa 400 aber er hat mir ja nur das ausgelesen, was ich haben will, nämlich die ID.
|
|
 06.06.2008 21:53 Uhr
|
|
|
|
|
readFully befüllt anscheinend den Buffer mit den einzelnen Bytes in deinem Dat-File. Ich glaube, dass es mehr zu lesen versucht als an Datenbytes vorhanden ist und deswegen die Exception wirft.
Wie gesagt, bist du dir sicher, dass das Encoding des Files stimmt?
___________________________ "Etre fort pour être utile" - Georges Hébert
|
|
 07.06.2008 01:03 Uhr
|
|
|
|
|
Zitat: Die Länge ist etwa 400
"Etwa" ist etwas ungenau, um in einer Datei zu seeken
Der "else" Zweig scheint den Lesezeiger im File bei 400 vor Ende zu positionieren. Das muss nicht unbedingt der Anfang einer zu lesenden ID sein (deiner Beschreibung nach).
Ausserdem stimmen die Zeilennummern deines Stacktraces nicht mit dem geposteten Code überein, so bringt das nicht wirklich viel ...
|
|
 08.06.2008 15:11 Uhr
|
|
|
|
|
Die angegebene Zeile ist diese:
String s = ausgabe.readUTF();
Das Problem bei der Länge ist, dass sie etwa zwischen 375 und 425 schwankt.
Habe mitlerweilen auch schon versucht mit Vektoren zu arbeiten, allerdings bin ich da auch nicht sehr weit gekommen.
Vielleicht mal das Ganze andersherum versuchen. Weiß jemand, wie ich meine Datensätze problemlos ein- und auslesen kann, um sie später auch ändern zu können.
|
|
 08.06.2008 20:41 Uhr
|
|
|
|
|
Das ist schon klar, dass die Exception bei irgendeiner Leseoperation geworfen wird. Ich habe den Eindruck, du hast generell Probleme, richtig Datensätze zu schreiben. So wie es aussieht, schreibst du deine Entities einfach hintereinander und zwar durch Linebreaks (zufällig oder von dir so gewollt?) getrennt. Du kannst aber den Lesezeiger nicht irgendwo positionieren, wenn du anschliessend UTF kodierte Zeichen lesen willst. Du musst schon genau wissen, dass an dieser Stelle eine Entity beginnt, da ein Zeichen UTF-8 kodiert, keine feste Bytelänge besitzt. D.h. wenn du genau in der Mitte eine kodierten Zeichens zu lesen beginnst, kann's nicht klappen.
Lies dir vielleicht das mal durch (hab's nur überflogen, aber sollte helfen)
RandomIO.pdf
|
|
 09.06.2008 09:43 Uhr
|
|
|
|
|
Wieso machst du das ganze nicht einfach mit XML? Dann könntest du das Attribut bzw. den Knoten anhand seines Namens ansprechen und diese Probleme wären gelöst. Aber es würde dir ja schon helfen, die die mit einem eigenen Format zu versehen, dass es dir erlaubt sie leichter zu parsen.
In etwa so:
[Abteil1]
ID:23939585
Name:Value
Name2:Value2
[Abteil2]
...
Oder, du erstellst dir eine Klasse und serialisierst sie in ein File. Das macht das ganze noch einfacher zum auslesen, da du dann eine Kette von schon befüllten Objekten erhältst beim auslesen.
___________________________ "Etre fort pour être utile" - Georges Hébert
|
|