Come scrivere e leggere oggetti serializzati java in un file

Ho intenzione di scrivere più oggetti su un file e poi recuperarli in un’altra parte del mio codice. Il mio codice non ha errori, ma non funziona correttamente. Potresti per favore aiutarmi a scoprire cosa c’è di sbagliato nel mio codice. Ho letto diversi codici da diversi siti web, ma nessuno di loro ha funzionato per me!

Ecco il mio codice per scrivere i miei oggetti su un file: MyClassList è un arraylist che include oggetti della mia class (che devono essere scritti in un file).

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)); } 

Ho aggiunto “true” al costruttore di outputstream, perché voglio aggiungere ogni object alla fine del file. È corretto?

Ed ecco il mio codice per leggere gli oggetti dal file:

  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(); } 

Stampa infine solo un object. Ora, non so se non sto scrivendo correttamente o leggendo correttamente!

Perché non serializzare l’intera lista in una sola volta?

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

Supponendo, ovviamente, che MyClassList sia un ArrayList o LinkedList o un’altra raccolta Serializable .

In caso di lettura, nel tuo codice hai pronto un solo object, non c’è loop per raccogliere tutto l’articolo scritto.

Come altri hanno suggerito, è ansible serializzare e deserializzare l’intera lista in una sola volta, il che è più semplice e sembra corrispondere perfettamente a ciò che si intende fare.

In tal caso diventa il codice di serializzazione

 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(); } } 

E la deserializzazione diventa (assumendo che myClassList sia una lista e sperando che tu usi i generici):

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

È inoltre ansible deserializzare diversi oggetti da un file, come previsto:

 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(); } } 

Non dimenticare di chiudere gli oggetti stream in una clausola finally (nota: può generare un’eccezione).

MODIFICARE

Come suggerito nei commenti, dovrebbe essere preferibile utilizzare try con le risorse e il codice dovrebbe diventare molto più semplice.

Ecco la serializzazione delle liste:

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

Penso che tu debba scrivere ogni object su un proprio file o devi dividerlo quando lo leggi. Puoi anche provare a serializzare la tua lista e recuperarla quando deserializzi.

se serializzi l’intero elenco, devi anche declassificare il file in un elenco quando lo rileggi. Ciò significa che caricherete inevitabilmente in memoria un file di grandi dimensioni. Può essere costoso. Se hai un grosso file e devi ridurlo riga per riga (-> object per object) procedi con la tua idea iniziale .

serializzazione:

 LinkedList listOfObjects = ; try { FileOutputStream file = new FileOutputStream(); 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-serializzazione:

 try { FileInputStream file = new FileInputStream(); 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); }