it-swarm.com.de

So schreiben und lesen Sie in Java serialisierte Objekte in eine Datei

Ich werde mehrere Objekte in eine Datei schreiben und sie dann in einem anderen Teil meines Codes abrufen. Mein Code hat keine Fehler, funktioniert aber nicht richtig. Könnten Sie mir bitte helfen, herauszufinden, was an meinem Code falsch ist ... Ich habe verschiedene Codes von verschiedenen Websites gelesen, aber keiner von ihnen hat für mich funktioniert!

Hier ist mein Code, um meine Objekte in eine Datei zu schreiben: MyClassList ist eine Arrayliste, die Objekte meiner Klasse enthält (die in eine Datei geschrieben werden müssen).

for (int cnt = 0; cnt < MyClassList.size(); cnt++) {
    FileOutputStream fout = new FileOutputStream("G:\\address.ser", true);
    ObjectOutputStream oos = new ObjectOutputStream(fout);
    oos.writeObject(MyClassList.get(cnt));
}

Ich habe dem Konstruktor des Ausgabestroms "true" hinzugefügt, weil ich jedes Objekt am Ende der Datei hinzufügen möchte. Ist das korrekt?

Und hier ist mein Code zum Lesen der Objekte aus der Datei:

 try {
     streamIn = new FileInputStream("G:\\address.ser");
     ObjectInputStream objectinputstream = new ObjectInputStream(streamIn);
     MyClass readCase = (MyClass) objectinputstream.readObject();
     recordList.add(readCase);
     System.out.println(recordList.get(i));
 } catch (Exception e) {
     e.printStackTrace();
 }

Es wird schließlich nur ein Objekt gedruckt. Nun weiß ich nicht, ob ich nicht richtig schreibe oder richtig lese!

48
user1419243

Warum nicht die gesamte Liste auf einmal serialisieren?

FileOutputStream fout = new FileOutputStream("G:\\address.ser");
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(MyClassList);

Angenommen, MyClassList ist natürlich eine ArrayList oder LinkedList oder eine andere Serializable-Sammlung.

Wenn Sie es zurücklesen, ist in Ihrem Code nur ein Element verfügbar, und es gibt keine Schleife, um das gesamte geschriebene Element zu sammeln.

66
forty-two

Wie von anderen vorgeschlagen, können Sie die gesamte Liste auf einmal serialisieren und deserialisieren. Dies ist einfacher und scheint perfekt zu sein, was Sie beabsichtigen.

In diesem Fall wird der Serialisierungscode

ObjectOutputStream oos = null;
FileOutputStream fout = null;
try{
    fout = new FileOutputStream("G:\\address.ser", true);
    oos = new ObjectOutputStream(fout);
    oos.writeObject(myClassList);
} catch (Exception ex) {
    ex.printStackTrace();
} finally {
    if(oos != null){
        oos.close();
    } 
}

Deserialisierung wird (vorausgesetzt, dass myClassList eine Liste ist und hofft, dass Sie Generics verwenden werden):

ObjectInputStream objectinputstream = null;
try {
    FileInputStream streamIn = new FileInputStream("G:\\address.ser");
    objectinputstream = new ObjectInputStream(streamIn);
    List<MyClass> readCase = (List<MyClass>) objectinputstream.readObject();
    recordList.add(readCase);
    System.out.println(recordList.get(i));
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if(objectinputstream != null){
        objectinputstream .close();
    } 
}

Sie können auch mehrere Objekte aus einer Datei deserialisieren, wie Sie es beabsichtigt haben:

ObjectInputStream objectinputstream = null;
try {
    streamIn = new FileInputStream("G:\\address.ser");
    objectinputstream = new ObjectInputStream(streamIn);
    MyClass readCase = null;
    do {
        readCase = (MyClass) objectinputstream.readObject();
        if(readCase != null){
            recordList.add(readCase);
        } 
    } while (readCase != null)        
    System.out.println(recordList.get(i));
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if(objectinputstream != null){
        objectinputstream .close();
    } 
}

Vergessen Sie nicht, Stream-Objekte in einer finally-Klausel zu schließen (Hinweis: Es kann eine Ausnahme ausgelöst werden).

EDIT

Wie in den Kommentaren vorgeschlagen, sollte es besser sein, try mit resources zu verwenden und der Code sollte etwas einfacher werden. 

Hier ist die Listenserialisierung:

try(
    FileOutputStream fout = new FileOutputStream("G:\\address.ser", true);
    ObjectOutputStream oos = new ObjectOutputStream(fout);
){
    oos.writeObject(myClassList);
} catch (Exception ex) {
    ex.printStackTrace();
}
44
C.Champagne

Einfaches Programm zum Schreiben von Objekten in eine Datei und Lesen von Objekten aus der Datei.

package program;

import Java.io.File;
import Java.io.FileInputStream;
import Java.io.FileOutputStream;
import Java.io.ObjectInputStream;
import Java.io.ObjectOutputStream;
import Java.io.Serializable;

public class TempList {

  public static void main(String[] args) throws Exception {
    Counter counter = new Counter(10);

    File f = new File("MyFile.txt");
    FileOutputStream fos = new FileOutputStream(f);
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(counter);
    oos.close();

    FileInputStream fis = new FileInputStream(f);
    ObjectInputStream ois = new ObjectInputStream(fis);
    Counter newCounter = (Counter) ois.readObject();
    System.out.println(newCounter.count);
    ois.close();
  }

}

class Counter implements Serializable {

  private static final long serialVersionUID = -628789568975888036 L;

  int count;

  Counter(int count) {
    this.count = count;
  }
}

Nach dem Ausführen des Programms wird die Ausgabe in Ihrem Konsolenfenster 10 sein und Sie können die Datei im Testordner finden, indem Sie auf das Symbol in der Abbildung unten klicken.

 enter image description here

1
Roshan Halwai

wenn Sie die gesamte Liste serialisieren, müssen Sie die Datei auch in eine Liste zurücksortieren, wenn Sie sie zurücklesen. Dies bedeutet, dass Sie zwangsläufig eine große Datei in den Speicher laden. Es kann teuer werden. Wenn Sie eine große Datei haben und diese zeilenweise (-> Objekt für Objekt) teilen müssen, fahren Sie mit mit Ihrer ursprünglichen Idee fort .

Serialisierung:

LinkedList<YourObject> listOfObjects = <something>;
try {
    FileOutputStream file = new FileOutputStream(<filePath>);
    ObjectOutputStream writer = new ObjectOutputStream(file);
    for (YourObject obj : listOfObjects) {
        writer.writeObject(obj);
    }
    writer.close();
    file.close();
} catch (Exception ex) {
    System.err.println("failed to write " + filePath + ", "+ ex);
}

De-Serialisierung:

try {
    FileInputStream file = new FileInputStream(<filePath>);
    ObjectInputStream reader = new ObjectInputStream(file);
    while (true) {
        try { 
            YourObject obj = (YourObject)reader.readObject();
            System.out.println(obj)
        } catch (Exception ex) {
            System.err.println("end of reader file ");
            break;
        }
    }
} catch (Exception ex) {
    System.err.println("failed to read " + filePath + ", "+ ex);
}
0
angelo.mastro

Ich denke, Sie müssen jedes Objekt in eine eigene Datei schreiben, oder Sie müssen das Objekt beim Lesen aufteilen. Sie können auch versuchen, Ihre Liste zu serialisieren und beim Deserialisieren abzurufen. 

0
Sammy