2010-07-05 18 views
11

Sto cercando di leggere alcuni oggetti da un file. Il codice funziona bene per la prima iterazione e alla seconda iterazione fornisce una StreamCorruptedException. Ecco il mio codice,java.io.StreamCorruptedException: codice di tipo non valido: 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); 
     } 

di seguito fa parte dell'eccezione. Prima di stampare questo '1' è stampata (a causa del 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) 

io non riesco a capire perché questo sta accadendo. In alcuni post del forum mi sono imbattuto in ciò che accade quando si aggiunge a un file durante la scrittura. È la vera ragione? (Sto accodando al file durante la fase di scrittura). Se è così esiste un modo corretto di leggere un file aggiunto?

Ecco il codice che uso per scrivere sul file

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

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

scrittura non è un processo iterativo.

Grazie :)

+0

Vuoi essere in grado di aggiungere un frammento di esempio di scrittura per il file come bene? –

+0

La dimensione dell'oggetto può essere una questione? Ogni oggetto che sto scrivendo ha un oggetto immagine (Icona) – Niroshan

+0

Non è corretto eseguire il ciclo finché 'readObject()' non restituisce nulla. Non lo fa alla fine del flusso, e può farlo in qualsiasi altro momento in cui hai scritto un null. È necessario eseguire il ciclo fino a quando non viene generata l'eccezione EOFException. – EJP

risposta

13

(sto aggiungendo al file durante la fase di scrittura)

E questo è il problema. Non è possibile aggiungere a un ObjectOutputStream. Ciò corromperà definitivamente lo stream e otterrai StreamCorruptedException.

Ma ho già lasciato una soluzione a questo problema su SO: un AppendableObjectOutputStream

EDIT

dallo scrittore vedo che si scrive uno oggetto di controllo e filo e chiudere il flusso. Dal lettore, vedo chiaramente che stai cercando di leggere più di un oggetto di controllo. E puoi leggere il primo ma non il resto. Quindi per me è perfettamente chiaro che riapri il flusso e aggiungi sempre più oggetti di controllo. Che non è permesso

È necessario scrivere tutti gli controllare gli oggetti in 'una sessione'. Oppure utilizzare AppendableObjectOutputStream anziché ObjectOutputStream standard.

+0

questo è esattamente quello che sto facendo qui. Grazie. C'è un altro modo per scrivere un file nel modo in cui sto facendo e usare un meccanismo di lettura standard? – Niroshan

+0

È possibile scrivere tutti i controlli su file separati, ma per un file è necessario scrivere in una sessione.(o usa la mia classe - quindi non devi cambiare gran parte del tuo codice) –

+0

Grazie ancora, sembra che usare la tua classe sia la soluzione migliore – Niroshan

3

Creazione di un nuovo ObjectInputStream senza chiudere la FileInputStream sottostante risolve questo problema:

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

Questa risposta risolve il problema sottostante di aver usato più istanze ObjectOutputStream per scrivere i controlli separati , quindi se il file proviene da una terza parte, questa è la strada da percorrere – Atreys

+0

Tutto ciò che serve ora è sapere magicamente quando aprire un nuovo 'ObjectInputStream'. La soluzione in realtà non è quella di causare il problema in primo luogo. – EJP

Problemi correlati