File serializzati

di il
2 risposte

File serializzati

Devo memorizare dati in un file .dat con dati già esistenti. Apro il file in modalità append (true) (istruzione (***)) e il programma va in errore. Se elimino true tutto funziona correttamente ma i dati gia' esistenti vengono cancellati. Voglio evitare di trasferire tutto in un vettore per ritrasferirlo successivamente nel file. E' possibile?

Allego il codice

import java.io.*;
/*
Memorizza cognome e nome in un file serializzato
*/
public class file_serializzazione_01 {

public static void main(String[] args) {

//impostazione dello standard di input
InputStreamReader in = new InputStreamReader(System.in);
BufferedReader tastiera = new BufferedReader(in);

String wcogn,wnome;
String risp="s";
//dichiarazione oggetto
anag oanag;

try{
//definizione stream e apertura del file anag.dat
FileOutputStream w=new FileOutputStream("anag.dat",true); //(***)
//definizione stream per l'utilizzo dei metodi per la scrittura
ObjectOutputStream fw=new ObjectOutputStream(w);
while (risp.equals("s")){

System.out.print("Cognome ");
wcogn=tastiera.readLine();
System.out.print("Nome ");
wnome=tastiera.readLine();

//creazione istanza dell'oggetto (memorizzazione dati
//nell'oggetto
oanag=new anag(wcogn,wnome);

//scrittura dell'oggetto nel file fr
fw.writeObject(oanag);

System.out.println("Continui s/n ?");
risp=tastiera.readLine();
}
fw.flush();
fw.close();

}

===========classe============

import java.io.*;
public class anag implements Serializable {

//elenco attributi
public String cogn;
public String nome;

//costruttore
public anag(String cogn,String nome){
this.cogn=cogn;
this.nome=nome;
}
}

2 Risposte

  • Re: File serializzati

    daiazu ha scritto:


    Devo memorizare dati in un file .dat con dati già esistenti. Apro il file in modalità append (true)
    Ecco, già qui è sbagliato. La serializzazione utilizza un protocollo binario ben preciso che prevede un "header" iniziale che viene scritto ad ogni creazione del ObjectOutputStream.
    Se "appendi" ottieni:

    [header][oggetti.....][header][oggetti.....]

    Quando ObjectInputStream rilegge tutto da capo, ad un certo punto incontra il secondo header, che NON ci dovrebbe essere. E ritiene quindi che lo stream sia "sballato".

    In senso generale, quindi, la serializzazione degli oggetti non è fatta per funzionare "in append".

    daiazu ha scritto:


    Voglio evitare di trasferire tutto in un vettore per ritrasferirlo successivamente nel file. E' possibile?
    In generale, no. La cosa più semplice è appunto quella di leggere tutto e tenerlo in memoria in una appropriata "collezione", quindi si modifica la collezione e infine si riscrive il tutto su file.

    Dipende quali sono i tuoi obiettivi .... se è una applicazione "didattica", non credo ci siano problemi in tal senso (e nemmeno di "performance") a meno di imposizioni/restrizioni specifiche.
    Se è per altro .... precisa.

    Se invece andiamo nei dettagli di ObjectOutputStream, sappi che quel header viene scritto da un metodo di ObjectOutputStream che si chiama writeStreamHeader() e questo metodo è marcato protected, quindi ridefinibile .....
  • Re: File serializzati

    Ok, spiegazione eccellente per quanto riguarda il meccanismo degli header. Quindi non è possibile definire una modalità append (come nei file di testo). Supponiamo di avere diversi migliaia di oggetti memorizzati in un file serializzato. Da quanto è stato messo in evidenza, si dovrebbero trasferire in un array. Ma è conveniente avere un array composto da migliaia di oggetti direttamente in memoria? Un tale struttura non occupa troppo spazio con il rischio di non avere ram sufficiente a contenerla?

    Grazie.
Devi accedere o registrarti per scrivere nel forum
2 risposte