java - Lesen mehrerer Objekte aus einer Datei, wie Sie waren, in ein array
Ich würde Sie gerne Fragen, wie die community, was denkst du über die folgende situation. Die Aufgabe ist das schreiben von Objekten in eine Datei. Was könnte gemacht werden, indem eine Liste von Objekten auf der Datei, die kann ich später Lesen, so habe ich meine Objekte wieder. Hier würde ich schreiben praktisch NUR EIN Objekt auf die Datei, nämlich der Liste (enthalten mehr Objekte).
Aber, die Aufgabe, die Nähte zu schreiben, eigene Objekte zu der Datei, die die Methode erhält eine Liste. Die Objekte können alles sein. (Sie müssen serialisierbar sein, natürlich)
Also ich habe:
public class TaskStream {
public static void saveObjects(ArrayList<Object> al) {
try {
FileOutputStream fos = new FileOutputStream("outputFile", true);
try {
ObjectOutputStream oos = new ObjectOutputStream(fos);
for (Object o : al){
try {
oos.writeObject(o);
System.out.println("saved");
} catch (NotSerializableException e) {
System.out.println("An object was not serializable, it has not been saved.");
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
Das funktioniert gut.
Aber jetzt, würde ich mag, Sie zu Lesen. Meine erste concept über, es wäre eine Art von Verfahren, das liest Objekte, bis die Datei-Objekte, und ich kann sparen Sie jede von Ihnen in einer Liste wieder (das ist die Aufgabe). So wie Pseudo-code:
for(Object o : fileToRead){ list.add(o) }
Wie wäre es möglich? Ich begann zu spielen, um mit der readObject-Methode der ObjectInputStream, aber es scheint, führen zu vielen Fehlern.
Haben Sie eine Idee? Oder was wäre die beste Praxis, indem Sie eine solche Aufgabe?
Dank!
Habe ich versucht, Ihre Idee. Die genaue Umsetzung:
public static ArrayList<Object> readObjects(){
ArrayList<Object> al = new ArrayList<Object>();
boolean cont = true;
try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("outputFile"));
while(cont){
Object obj=null;
try {
obj = ois.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
if(obj != null)
al.add(obj);
else
cont = false;
}
} catch (FileNotFoundException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
return al;
}
Das Programm zu testen Schreibe ich zwei Objekte in der Datei.
Ich Lesen Sie die Objekte aus der Datei und fügen Sie Sie in einer Liste.
Ich Durchlaufen Sie diese Liste durch und drucken Sie den Inhalt.
Wenn ich das Programm starte passiert Folgendes (ich löschte die Ausgabedatei, so kann das Programm
neu erstellen und alles von vorne).
Ergebnis:
Die beiden Objekte aus der Liste wird erfolgreich bedruckt werden.
Aber ich bekomme dieses:
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2598)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1318)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
...
Ich etwas nicht ändern, und ich das Programm erneut ausführen. Ergebnis:
Die beiden Objekte aus der Liste wird erfolgreich bedruckt werden.
Aber ich bekomme dieses:
java.io.StreamCorruptedException: invalid type code: AC
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1377)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
Nunmehr alle erneut bringt das gleiche Ergebnis.
Wenn ich wiederholen Sie den gesamten Prozess wieder von vorne (Start durch löschen der Ausgabedatei -) alles geschieht genau das gleiche (wie erwartet).
Haben Sie Ideen wie man es beheben? Vielen Dank für die Hilfe!
ja, ich habe auch schon gelesen, aber da schreibt er eine Liste auf die Datei. Normalerweise würde ich das gleiche tun, aber die Aufgabe ist zu schreiben, separate Objekte in der Datei...
Welche Fehler sind Sie immer ? Und können Sie nach dem code lieber als der pseudo-code, da es jetzt scheint, du machst es richtig ...
Hi Vlatkozelka und Mitch, bitte sehen Sie sich den post nochmal editiert, thx!!!
ok, also danke für die Idee mit dem boolean cont! Für diejenigen, die dieses problem auch, ich habe fangen die EOFException, dass ist ok dann, und ich gab die Idee an Datei Anhängen, so dass ich Sie gelöscht, das argument "true" durch das erstellen der Ausgabe. also werde ich tun: wenn ich möchte anfügen, zuerst lese ich alle Infos, setzen Sie es in eine Liste, fügen Sie die zusätzliche info auf der Liste, und schreiben Sie in die Datei, wenn jemand hat eine bessere Idee haben, bitte teilen, thx
InformationsquelleAutor user3435407 | 2014-12-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie gehen zu wollen, zu verwenden FileInputStream und ObjectInputStream.
Dies nicht erreichen Vergleich - exception geworfen bei readObject() - catch IOException im inneren Schleife statt
InformationsquelleAutor MitchAman
Wir habe zu eingesetzt FileInputStream-Klasse die Methode "available" - Methode, um zu überprüfen, gegebenen-stream Daten-oder Byte zu Lesen oder nicht, wenn die Daten nicht vorhanden ist, dann wird diese Methode return 0;
InformationsquelleAutor Ankit Chandora
Können wir Sie auf alle hinzufügen, das Objekt in eine Liste und dann serialisieren der Liste. Wieder können wir Deserialisieren der Liste und wir können die Liste Durchlaufen, um die Objekte , die wir suchen. Es wird die Verwendung der unten aufgeführten Klassen.
FileOutputStream
FileInputStream
ObjectInputStream
ObjectOutputStream
InformationsquelleAutor pushkars
Ich weiß das Thema ist alt, aber ich glaube ich weiß die Lösung des Problems.
Der Grund, warum Sie bekommen
ist, weil Sie nach dem schreiben ein Objekt und versuchen Sie , es zu Lesen, die ObjectInputStream versucht, Lesen Sie die Informationen Ihr ObjectOutputStream schrieb. Das ist, wie Serialisierung funktioniert im Allgemeinen.
Das problem an deinem code ist, dass eine neue ObjectInputStream wird immer erstellt und versucht zu Lesen, wieder aus einem alten ObjectOutputStream und er findet heraus, dass Sie nicht den gleichen serial code, so dass Sie diese Fehlermeldung erhalten.
Ich habe eine Lösung gefunden in einem anderen Thema gepostet vor einiger Zeit , schauen Sie hier :stackoverflow-Lösung
Was er tut, ist, dass er overridng die streamWriter, die "tricks" der ObjectInputStream zu glauben, dass er Lesen kann ObjectOutputStream.
Hoffe, das ist hilfreich.
Peace out!
InformationsquelleAutor KeyboardFlexing
InformationsquelleAutor CodingKick