2010-07-05 12 views
11

Ich versuche, einige Objekte aus einer Datei zu lesen. Der Code funktioniert für die erste Iteration und bei der zweiten Iteration gibt es eine StreamCorruptedException. Hier ist mein Code,java.io.StreamCorruptedException: ungültiger Typcode: AC

private ArrayList<Cheque> cheques = null; 
ObjectInputStream ois = null; 
     try { 
      cheques = new ArrayList<Cheque>(4); 
      ois = new ObjectInputStream(new FileInputStream("src\\easycheque\\data\\Templates.dat")); 
      Object o = null; 
      try { 
       o = ois.readObject(); 
       int i=1; 
       while (o != null) { 
        cheques.add((Cheque) o); 
        System.out.println(i++); // prints the number of the iteration 
        o = ois.readObject(); // exception occurs here 
       } 
      } catch (ClassNotFoundException ex) {// for ois readObject() 
       Logger.getLogger(TemplateReader.class.getName()).log(Level.SEVERE, null, ex); 

      } catch (EOFException ex) {// for ois readObject() 
       // end of the file reached stop reading 
       System.out.println("ois closed"); 
       ois.close(); 

      } 
     } catch (IOException ex) { 
      Logger.getLogger(TemplateReader.class.getName()).log(Level.SEVERE, null, ex); 
     } 

unten ist ein Teil der Ausnahme. Vor dem Druck dieses ‚1‘ gedruckt wird (wegen der sout)

SEVERE: null 
java.io.StreamCorruptedException: invalid type code: AC 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) 

kann ich nicht herausfinden, warum dies geschieht. In einigen Forenposts stieß ich darauf, dass dies passiert, wenn Sie während des Schreibens eine Datei anhängen. Ist das der wahre Grund? (Ich lege während der Schreibphase an die Datei an). Wenn ja, gibt es eine geeignete Methode zum Lesen einer angehängten Datei?

hier ist der Code i

ObjectOutputStream objectOut = new ObjectOutputStream(new FileOutputStream("src\\easycheque\\data\\templates.dat", true)); 

objectOut.writeObject(cheque); 
objectOut.flush(); 
objectOut.close(); 

Schreiben in die Datei zu schreiben, verwenden nicht ein iterativer Prozess.

Danke :)

+0

Möchten Sie auch ein Beispiel Snippet Schreiben in die Datei der Lage sein, hinzufügen? –

+0

Kann Objektgröße eine Sache sein? Jedes Objekt, das ich schreibe, hat ein Bildobjekt (Icon) – Niroshan

+0

Es ist nicht korrekt zu loopen, bis 'readObject()' null zurückgibt. Am Ende des Streams wird das nicht getan, und es kann jedes Mal, wenn Sie eine Null schreiben, es tun. Sie müssen eine Schleife ausführen, bis "EOFException" ausgelöst wird. – EJP

Antwort

13

(ich in die Datei während der Schreibphase am anhängen)

Und das ist das Problem. Sie können nicht an einen ObjectOutputStream anhängen. Das wird den Stream definitiv beschädigen und Sie erhalten StreamCorruptedException.

Aber ich ging bereits eine Lösung für dieses Problem auf SO: ein AppendableObjectOutputStream

EDIT

Vom Autor, den ich sehe, dass Sie ein Prüfobjekt und bündig und schließen Sie den Stream zu schreiben. Aus dem Leser, ich sehe deutlich, dass Sie versuchen, mehr als ein Check-Objekt zu lesen. Und Sie können den ersten lesen, aber nicht den Rest. Für mich ist es völlig klar, dass Sie den Stream erneut öffnen und mehr und mehr Prüfobjekte anhängen. Was nicht erlaubt ist.

Sie müssen schreiben alle überprüfen Objekte in 'einer Sitzung'. Oder verwenden Sie den AppendableObjectOutputStream anstelle des Standard-ObjectOutputStream.

+0

Yep das ist genau das, was ich hier mache. Vielen Dank. Gibt es eine andere Möglichkeit, eine Datei so zu schreiben, wie ich es tue und einen Standardlesemechanismus zu verwenden? – Niroshan

+0

Sie könnten alle Prüfungen in separate Dateien schreiben - aber für eine Datei müssen Sie in einer Sitzung schreiben.(oder verwenden Sie meine Klasse - dann müssen Sie nicht viel von Ihrem Code ändern) –

+0

Noch einmal, es scheint, Ihre Klasse ist die bessere Lösung – Niroshan

3

Erstellen eines neuen Object, ohne die zugrunde liegenden Fileinputstream schließen löst dieses Problem:

FileInputStream fin = new FileInputStream(file); 
    while (...) { 
     ObjectInputStream oin = new ObjectInputStream(fin); 
     Object o = oin.readObject(); 
     ... 
    } 
    fin.close(); 
+0

Diese Antwort adressiert das zugrunde liegende Problem der Verwendung mehrerer ObjectOutputStream-Instanzen zum Schreiben der separaten Prüfungen Wenn also die Datei von einer dritten Partei stammt, ist dies der Weg zu gehen. – Atreys

+0

Alles, was Sie jetzt brauchen, ist magisch zu wissen, wann man einen neuen 'ObjectInputStream' öffnet. Die Lösung ist eigentlich nicht das Problem an erster Stelle zu verursachen. – EJP

Verwandte Themen