Problema programma creazione file

di il
14 risposte

Problema programma creazione file

Buonasera. Stavo cercando di creare un file con Java in cui vengono registrati tutti i prodotti inseriti in un magazzino . Ho sviluppato tutto in 4 classi.
La classe Prodotto che prende le informazioni del prodotto e la classe Magazzino nella quale è dichiarato un array di oggetti "vectormag" che riceve appunto le istanze della classe Prodotto quante volte decide l'utente. Queste istanze poi vengono scritte sul file "magazzino.dat" tramite il metodo writeObject() implementato nella classe ScriviDati e successivamente lette mediante il metodo readObject() implementato nella classe Leggidati. L'eccezioni che riscontro però sono queste:
quando eseguo la classe ScriviDati: java.io.InputStreamReader
quando eseguo la classe LeggiDati : writing aborted; java.io.NotSerializableException: java.io.InputStreamReader
dalla seconda eccezione mi viene da pensare che richiede che sia serializzabile anche la classe InputStreamReader di java, ma come faccio a renderla tale,dunque apportandogli modifiche, dato che è una classe predefinita di Java?
Vi lascio il codice


CLASSE PRODOTTO

package FILEMAGAZZINO;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.Serializable;

public class Prodotto implements Serializable {
    String prod,provenienza;
    int peso;
    InputStreamReader input = new InputStreamReader(System.in);
    BufferedReader tastiera = new BufferedReader(input);
    void set(){
        try {
            System.out.println("INSERISCI IL PRODOTTO");
            prod = tastiera.readLine();
            System.out.println("INSERISCI LA PROVENIENZA");
            provenienza = tastiera.readLine();
            System.out.println("INSERISCI IL PESO DEL PRODOTTO");
            peso = Integer.valueOf(tastiera.readLine()).intValue();
        } catch (Exception e) {
            System.out.println("VALORE ERRATO");
        }
    }
}
CLASSE MAGAZZINO
package FILEMAGAZZINO;


import java.io.Serializable;
import java.util.Vector;

public class Magazzino implements Serializable {
    protected Vector vectormag=new Vector();
    private Prodotto prod;
    public void charge(int i){
        for(int z=0; z<i; z++){
            prod= new Prodotto();
            prod.set();
            vectormag.addElement(prod);
        }
        System.out.println("TUTTI I PRODOTTI SONO STATI CARICATI NELL'ARRAY");
    }

}
CLASSE SCRIVIDATI

package FILEMAGAZZINO;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;

public class ScriviDati {
    public static void main(String argv[]){
        Magazzino mag= new Magazzino();
        InputStreamReader input  = new InputStreamReader(System.in) ;
        BufferedReader tastiera = new BufferedReader(input);
        int z=0;
        try{
        System.out.println("QUANTI PRODOTTI CARICARE ?" ); z= Integer.valueOf(tastiera.readLine()).intValue();
        mag.charge(z);} catch(Exception e ){
            System.out.println("VALORE ERRATO!"); }
        try{
            FileOutputStream f = new FileOutputStream("magazzino.dat");
            ObjectOutputStream fOUT= new ObjectOutputStream(f);
            int i;
            for (i=0;i<z;i++){
            fOUT.writeObject(mag.vectormag.elementAt(i)); }
            fOUT.flush();
            f.close();

        } catch(Exception e ) {
            System.out.println("ECCEZIONE " + e.getMessage());
        }
    }
}

CLASSE LEGGIDATI

package FILEMAGAZZINO;

import java.io.EOFException;
import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class Leggidati {
    public static void main(String argv[]) {
        Prodotto prod;
        try {
            FileInputStream f = new FileInputStream("magazzino.dat");
            ObjectInputStream fIN = new ObjectInputStream(f);
            while (true) {
                try {
                    prod = (Prodotto) fIN.readObject();
                    System.out.println("PRODOTTO:" + prod.prod);
                    System.out.println("PROVENIENZA:" + prod.provenienza);
                    System.out.println("PROVENIENZA:" + prod.peso);
                } catch (EOFException e) {
                    break;
                }
            } 
        }
            catch (Exception e ) {
            System.out.println(" ECCEZIONE " + e.getMessage());
        }
    }
}

14 Risposte

  • Re: Problema programma creazione file

    Anonymous_User ha scritto:


    L'eccezioni che riscontro però sono queste:
    quando eseguo la classe ScriviDati: java.io.InputStreamReader
    quando eseguo la classe LeggiDati : writing aborted; java.io.NotSerializableException: java.io.InputStreamReader
    dalla seconda eccezione mi viene da pensare che richiede che sia serializzabile anche la classe InputStreamReader di java
    Mi spiace ma il programma è quasi tutto sbagliato. È sbagliato il modo di "modellare" le cose con le classi ed è anche sbagliato il modo di utilizzo della serializzazione.

    Il problema principale innanzitutto è la classe Prodotto, perché lo "stato" di un oggetto Prodotto non è composto solo dai dati del prodotto (che sono giusti: peso, provenienza, ecc...) ma anche da quel InputStreamReader e BufferedReader. Vuol dire che per ogni nuovo oggetto Prodotto hai un nuovo InputStreamReader e nuovo BufferedReader. Se avessi 100 oggetti Prodotto, avresti 100 InputStreamReader e 100 BufferedReader distinti. Già questo non ha assolutamente alcun senso/utilità.
    Ma anche il modo di popolare lo stato, cioè con quel set(), è parecchio inappropriato e per niene buono.
    Idem, sebbene in maniera leggermente differente, pure la classe Magazzino non è particolarmente buona.

    Ora, la questione è: sei in grado di affrontare meglio il design di quelle classi? Di quale aiuto e/o informazioni avresti bisogno? Quale è stato, perlomeno finora, il tuo percorso su Java?
  • Re: Problema programma creazione file

    @andbin innanzitutto ti ringrazio per la risposta. Ho iniziato Java a settembre, frequento il 4 anno di superiori. Le classi le ho sempre realizzate più o meno sul modello che ti ho mostrato, e nonostante non sia il modo più adatto, non ho mai riscontrato particolari problemi, credo sia più una questione di ordine e coerenza nella scrittura del codice, correggimi se sbaglio. Detto ciò, non saprei sinceramente come migliorare il design di quest’ultime, se hai qualche dritta da darmi mi farebbe molto piacere !
  • Re: Problema programma creazione file

    Anonymous_User ha scritto:


    Le classi le ho sempre realizzate più o meno sul modello che ti ho mostrato, e nonostante non sia il modo più adatto, non ho mai riscontrato particolari problemi, credo sia più una questione di ordine e coerenza nella scrittura del codice
    No, non è quello il punto. Per programmare in Java "ad oggetti" ci sono tutta una serie di principi e convenzioni da conoscere ed applicare.

    E giusto per darti una idea ....

    Facciamo una classe Persona:
    import java.io.Serializable;
    
    public class Persona implements Serializable {
        private static final long serialVersionUID = 1L;
    
        private String nome;
        private int annoNascita;
    
        public Persona(String nome, int annoNascita) {
            this.nome = nome;
            this.annoNascita = annoNascita;
        }
    
        public String getNome() {
            return nome;
        }
    
        public void setNome(String nome) {
            this.nome = nome;
        }
    
        public int getAnnoNascita() {
            return annoNascita;
        }
    
        public void setAnnoNascita(int annoNascita) {
            this.annoNascita = annoNascita;
        }
    
        @Override
        public String toString() {
            return "Persona[nome=" + nome + ", annoNascita=" + annoNascita + "]";
        }
    }
    I campi sono rigorosamente private, per il buon principio di "incapsulamento". E ci sono i metodi detti "accessori" (getter/setter) che rispettano le specifiche JavaBeans. C'è un costruttore esplicito ma solo per comodità nella costruzione. C'è un toString() che dà una forma che è quella tipica "tecnica" che si usa per debugging. Ma si potrebbe formare la stringa diversamente.
    Ci potrebbe essere dell'altro, es. i metodi equals(Object) e hashCode(). Sai a cosa servono? E quale è il "contratto" che deve esistere tra questi due? Anche questi sono concetti fondamentali da sapere.
    Ma la cosa importante: NON c'è input dall'utente, né letture/scritture su file.

    Il serialVersionUID non è fondamentale, è solo un "proforma" per la serializzazione e per non avere noiosi warning in un IDE.


    Poi facciamo una classe che rappresenta un insieme di persone:
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class ElencoPersone implements Serializable, Iterable<Persona> {
        private static final long serialVersionUID = 1L;
    
        private List<Persona> persone = new ArrayList<>();
    
        public void aggiungiPersona(Persona persona) {
            persone.add(persona);
        }
    
        @Override
        public Iterator<Persona> iterator() {
            return persone.iterator();
        }
    }
    Qui si potrebbero mettere altri metodi (es. "dammi la persona all'indice x", "dammi il numero di persone", ecc...). Non sono importanti per ora. La implementazione di Iterable è solo per rendere un oggetto ElencoPersone "iterabile", cioè scorribile, con il costrutto for-each di Java 5+ (vedi nel main() sotto).
    Anche qui NON c'è (non va messo) input dall'utente e preferibilmente/possibilmente nemmeno I/O su file.


    Poi facciamo una classe che è dedicata proprio al I/O su file di un elenco di persone:
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    
    public class FileElencoPersone {
        private File file;
    
        public FileElencoPersone(File file) {
            this.file = file;
        }
    
        public void scrivi(ElencoPersone elencoPersone) throws IOException {
            FileOutputStream fos = new FileOutputStream(file);
            ObjectOutputStream oos = null;
    
            try {
                oos = new ObjectOutputStream(fos);
                oos.writeObject(elencoPersone);
            } finally {
                if (oos != null) {
                    oos.close();
                } else {
                    fos.close();
                }
            }
        }
    
        public ElencoPersone leggi() throws IOException, ClassNotFoundException {
            FileInputStream fis = new FileInputStream(file);
            ObjectInputStream ois = null;
    
            try {
                ois = new ObjectInputStream(fis);
                return (ElencoPersone) ois.readObject();
            } finally {
                if (ois != null) {
                    ois.close();
                } else {
                    fis.close();
                }
            }
        }
    }
    Un oggetto FileElencoPersone incapsula solo un oggetto File, che non è nulla di particolare e non richiede alcuna attenzione particolare. E nota come leggi() e scrivi() siano molti simili e soprattutto "simmetrici". E quello è il modo corretto di trattare le eccezioni e in particolare i close() da fare sempre in ogni caso.

    Nota: da Java 7 si può sfruttare il costrutto try-with-resource, che permetterebbe di abbreviare molto i leggi/scrivi. Non l'ho applicato solo perché probabilmente non lo conosci. Ma non è importante.


    E per finire un semplice main() di prova:
    import java.io.File;
    
    public class MainProva {
        public static void main(String[] args) {
            try {
                FileElencoPersone fileElencoPersone = new FileElencoPersone(new File("persone.dat"));
    
                ElencoPersone elencoPersone = new ElencoPersone();
                elencoPersone.aggiungiPersona(new Persona("Mario", 1956));
                elencoPersone.aggiungiPersona(new Persona("Roberto", 1977));
    
                fileElencoPersone.scrivi(elencoPersone);
    
                // ora rileggo da file ...
                ElencoPersone elencoPersone2 = fileElencoPersone.leggi();
    
                for (Persona persona : elencoPersone2) {
                    System.out.println(persona);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    Non ho fatto (per semplicità/brevità) interazioni con l'utente. Ma nota come sia tutto "pulito", ben scritto, con le varie responsabilità ben separate e distribuite tra le varie classi. Nessuna classe fa "troppe" cose e nessuna ripete cose fatte da altre.

    Questo è il modo di affrontare la programmazione ad oggetti in Java.
  • Re: Problema programma creazione file

    Ti ringrazio nuovamente @andbin per le dritte. Non avevo mai sentito parlare del metodo hashCode() , se ho ben capito da ciò che ho letto online è come se fosse una verifica aggiuntiva di ciò che viene controllato mediante il metodo equals() perchè se quest'ultimo ritorna vero e l'hashcode attribuito alle aree di memoria dove risiedono gli oggetti confrontati è uguale, allora sicuramente possiamo dire che il contenuto di tali oggetti è il medesimo. Per quanto riguarda il codice volevo farti alcune domande perchè ho cercato di comprenderlo ma ho diversi dubbi anche perchè molti concetti non sono presenti sul libro dove sto studiando. Te li faccio presenti:
    Non ho ben capito l'utilità di questo metodo che ti sei creato
            
             public String toString() {
                return "Persona[nome=" + nome + ", annoNascita=" + annoNascita + "]";
            }
    
    poi un altra domanda... quando tu dichiari la classe Elencopersone dove essenzialmente implementi un array di oggetti da ciò che ho capito, specifichi con questo Iterable<Persona> che l'array si possa scorrere e poi richiamandoti il metodo iterator l'ggetto che ti ritornerà non sarà un generico Object ma un oggetto Persona grazie all'istruzione inserita prima Iterable<Persona> ?
    
        public ElencoPersone leggi() throws IOException, ClassNotFoundException {
            FileInputStream fis = new FileInputStream(file);
            ObjectInputStream ois = null;
    
            try {
                ois = new ObjectInputStream(fis);
                return (ElencoPersone) ois.readObject();
            } finally {
                if (ois != null) {
                    ois.close();
                } else {
                    fis.close();
                }
            }
    
    Per quanto riguarda l'implementazione dei metodi leggi() e scrivi() anteponendo public ElencoPersone hai evitato di crearti una nuova istanza di questa classe o c'è un altro motivo per cui hai dichiarato il metodo facendo riferimento alla classe ElencoPersone? poi , facendo return (ElencoPersone) cosa ti ritornerà il metodo? tutti gli oggetti contenenuti nell'array per via del metodo iterator descritto prima o altro ?
    Poi non riesco a capire cosa avviene nel finally, nella classe del File, sia per quanto riguarda la scrittura, che la lettura. In realtà non so proprio che funzione abbia questo "finally". Ho notato poi che non fai uso del metodo flush per svuotare il Buffer (in fase di scrittura ovviamente), non è necessario quindi?

    Per quanto riguarda il Main, perchè per leggere il file hai istanziato nuovamente la classe Elencopersone, non è superfluo dato che era gia stato fatto all'inizio e poi cosa fa il for? non l'ho mai visto scrivere cosi.
    for (Persona persona : elencoPersone2) {
                    System.out.println(persona);
                }
  • Re: Problema programma creazione file

    Anonymous_User ha scritto:


    Non avevo mai sentito parlare del metodo hashCode() , se ho ben capito da ciò che ho letto online è come se fosse una verifica aggiuntiva di ciò che viene controllato mediante il metodo equals() perchè se quest'ultimo ritorna vero e l'hashcode attribuito alle aree di memoria dove risiedono gli oggetti confrontati è uguale, allora sicuramente possiamo dire che il contenuto di tali oggetti è il medesimo.
    Nì .. più o meno. Il hashCode() viene usato principalmente in quelle collezioni che sono basate internamente su una hash-table, dove gli oggetti vengono distribuiti (il più equamente possibile) dentro più "bucket". Tipo le collezioni HashMap e HashSet.
    E c'è un contratto ben preciso con equals(). Se due oggetti sono "uguali" secondo equals(), allora i due hash-code DEVONO essere uguali. Due oggetti diversi secondo equals() invece POSSONO dare lo stesso hash-code. Questa si chiama "collisione" e più è "buona" la implementazione di hashCode(), meno c'è questa probabilità.

    Anonymous_User ha scritto:


    Per quanto riguarda il codice volevo farti alcune domande perchè ho cercato di comprenderlo ma ho diversi dubbi anche perchè molti concetti non sono presenti sul libro dove sto studiando.
    Di quale libro si tratta? E perché non ti sta dando concetti che invece sono fondamentali??

    Anonymous_User ha scritto:


    Non ho ben capito l'utilità di questo metodo che ti sei creato
            
            public String toString() {
                return "Persona[nome=" + nome + ", annoNascita=" + annoNascita + "]";
            }
    
    Il toString() è definito in Object (java.lang.Object). La sua implementazione predefinita fornisce una stringa molto tecnica e molto poco utile, del tipo "NomeClasse@3fee733d". Che normalmente non serve a nessuno (o raramente per debugging).
    Quando si scrive una nuova classe si ha quindi la facoltà di ridefinire (principio di override) il metodo toString() per fornire una descrizione più significativa dello stato dell'oggetto.

    Quando ad esempio fai un System.out.println(unOggetto); implicitamente viene stampato il risultato del toString() su quell'oggetto.

    Anonymous_User ha scritto:


    quando tu dichiari la classe Elencopersone dove essenzialmente implementi un array di oggetti da ciò che ho capito, specifichi con questo Iterable<Persona> che l'array si possa scorrere e poi richiamandoti il metodo iterator l'ggetto che ti ritornerà non sarà un generico Object ma un oggetto Persona grazie all'istruzione inserita prima Iterable<Persona> ?
    Non è un array ma una collezione (ArrayList). Comunque, implementando Iterable si fa in modo che un oggetto ElencoPersone sia lui stesso "iterabile" usando il for-each di Java 5.
    Se non ti è chiaro, non è importante, tralascia per ora.

    Anonymous_User ha scritto:


    Per quanto riguarda l'implementazione dei metodi leggi() e scrivi() anteponendo public ElencoPersone hai evitato di crearti una nuova istanza di questa classe o c'è un altro motivo per cui hai dichiarato il metodo facendo riferimento alla classe ElencoPersone?
    Non c'entra niente il public .. è solo ovviamente per rendere il metodo accessibile a qualunque altra classe. E ElencoPersone dopo il public è solo la dichiarazione del tipo di ritorno.

    Anonymous_User ha scritto:


    poi , facendo return (ElencoPersone) cosa ti ritornerà il metodo?
    Esattamente un oggetto di tipo ElencoPersone.

    Anonymous_User ha scritto:


    Poi non riesco a capire cosa avviene nel finally, nella classe del File, sia per quanto riguarda la scrittura, che la lettura. In realtà non so proprio che funzione abbia questo "finally".
    Devi studiare bene tutta la parte relativa alle eccezioni. Comunque il finally garantisce che il suo blocco venga eseguito sempre, sia che il blocco try completi normalmente, sia che lanci una eccezione.

    Anonymous_User ha scritto:


    Ho notato poi che non fai uso del metodo flush per svuotare il Buffer (in fase di scrittura ovviamente), non è necessario quindi?
    Il flush() lo fa già il close() di ObjectOutputStream.

    Anonymous_User ha scritto:


    Per quanto riguarda il Main, perchè per leggere il file hai istanziato nuovamente la classe Elencopersone, non è superfluo dato che era gia stato fatto all'inizio
    Prima ho creato programmaticamente io un ElencoPersone e l'ho popolato con 2 oggetti, quindi l'ho scritto su file.
    Poi semplicemente ho riletto il file e per chiarezza ho messo una seconda variabile elencoPersone2 per tenere il nuovo oggetto ElencoPersone tirato su dalla deserializzazione. Potevo ri-usare la stessa variabile elencoPersone ... non è quello il punto o problema.

    Anonymous_User ha scritto:


    e poi cosa fa il for? non l'ho mai visto scrivere cosi.
    for (Persona persona : elencoPersone2) {
                    System.out.println(persona);
                }
    È il enhanced-for, detto amichevolmente "for-each", introdotto in Java 5. Anche questo lo dovrai approfondire.
  • Re: Problema programma creazione file

    Tutto chiaro, ovviamente alcune cose dovrò approfondirle. Sapresti consigliarmi qualche libro Java dove poter vedere questi concetti, dato che il mio non li tratta? Ti ringrazio
  • Re: Problema programma creazione file

    Anonymous_User ha scritto:


    Sapresti consigliarmi qualche libro Java dove poter vedere questi concetti, dato che il mio non li tratta?
    Quello che io suggerisco di solito (perché ne ho sempre sentito parlare bene) è "Il Nuovo Java" - Claudio De Sio Cesari - HOEPLI
    O una delle edizioni precedenti sempre dello stesso autore (cambia la release di Java a cui il libro è aggiornato, ma per chi inizia da quasi-zero è poco rilevante e indifferente avere un libro su Java 11 o Java 15 o Java 17).
  • Re: Problema programma creazione file

    Grazie di nuovo. Buona giornata!
  • Re: Problema programma creazione file

    @andbin ho riscritto il programma, strutturandolo come mi hai consigliato. Da questo punto di vista ora credo che vada bene. C'è soltanto un problema che riscontro e non riesco a risolvere. La scrittura sul file viene fatta correttamente però poi in lettura viene generato l'errore: FileNotFoundException. Ho letto un po online e il problema probabilmente è dovuto al fatto che il file va a cercarlo in un percorso differente rispetto a quello dove viene creato, ma in realtà non è cosi. System.out.println(new File(".").getAbsolutePath()); Questa istruzione dovrebbe stamparmi il percorso dove va a cercarsi il file e sembra essere corretto, il percorso mostrato è quello dove si trova il file che ho creato. Ti lascio il codice della classe dove gestisco l' I/O del file.
    
    import java.io.*;
    public class IOFile {
    
        public void Scrivifile(Parco p) {
            try {
                FileOutputStream f = new FileOutputStream(" parcoauto.dat");
                ObjectOutputStream fOUT = new ObjectOutputStream(f);
                for (int i = 0; i < p.parco.size(); i++) {
                    fOUT.writeObject(p.parco.elementAt(i));
                }
               // fOUT.flush();
                fOUT.close();
    
            } catch (Exception e) {
                System.out.println(" ECCEZIONE" + e.getMessage());
    
            }
        }
    
        public void Leggidati() {
            Auto auto;
            try {
                FileInputStream f = new FileInputStream("parcoauto.dat");
                ObjectInputStream fIN = new ObjectInputStream(f);
                while (true) {
                    try {
                        auto = (Auto) fIN.readObject();
                        auto.GetAuto();
    
                    } catch (EOFException e) {
                        break;
                    }
                }
                f.close();
            } catch (Exception e) {
                System.out.println("ERRORE" + " " + e.getMessage());
                System.out.println(new File(".").getAbsolutePath());
    
            }
        }
    }
    
    
  • Re: Problema programma creazione file

    Anonymous_User ha scritto:


    
                FileOutputStream f = new FileOutputStream(" parcoauto.dat");
    
                FileInputStream f = new FileInputStream("parcoauto.dat");
    
    Attenzione, guarda bene le due stringhe!

    Comunque: il close() andrebbe sempre fatto, non hai usato il finally. Non ho nemmeno capito il senso/utilità di quel auto.GetAuto(); messo lì in mezzo ....
    Inoltre l'attesa di EOFException per la terminazione non è una buona cosa, perché stai usando una eccezione (quindi un evento "anomalo") per il controllo del flusso, che già questo di per sé è inappropriato. Ma poi c'è un altro aspetto. Se il file per qualunque motivo dovesse danneggiarsi/troncarsi, non te ne puoi accorgere perché un qualunque EOFException va sempre "bene" per indicare ok non ci sono più oggetti.
    Si risolve o serializzando un "contenitore" (banalmente es. un ArrayList o una classe specifica come il ElencoPersone del mio esempio) oppure serializzando per prima cosa un Integer che indica quanti oggetti aspettarsi alla lettura.
  • Re: Problema programma creazione file

    Ok allora proverò a gestire la terminazione come hai fatto tu. Comunque il metodo getAuto l'ho richiamato per visualizzare le informazioni della vettura dopo la lettura del File.
    In effetti il file non lo trovava perchè le due stringhe passate come parametri ai costruttori erano differenti, non ci avevo fatto caso... Ora comunque scrive e legge il contenuto del file correttamente ma c'è un problema. Mi sovrascrive ogni volta il contenuto facendomi visualizzare soltanto l'ultima vettura inserita. Allora ho provato a passare come 2 parametro al costruttore della classe FileOutputStream il valore true in modo che non sovrascrive ma accoda le informazioni ad un file già esistente. Cosi facendo però mi viene generato questo errore invalid type code: AC e dovrebbe esser dovuto al fatto che apro piu volte lo stream ObjectOutputStream, o sbaglio? C'è un modo per risolvere?
  • Re: Problema programma creazione file

    Anonymous_User ha scritto:


    Comunque il metodo getAuto l'ho richiamato per visualizzare le informazioni della vettura dopo la lettura del File.
    Non è comunque un buon momento quello (cioè dentro la lettura) visualizzare le informazioni sugli oggetti letti. Non che sia proprio sbagliato, ma di solito non si fa lì ma ad un livello più alto.

    Anonymous_User ha scritto:


    Mi sovrascrive ogni volta il contenuto facendomi visualizzare soltanto l'ultima vettura inserita. Allora ho provato a passare come 2 parametro al costruttore della classe FileOutputStream il valore true in modo che non sovrascrive ma accoda le informazioni ad un file già esistente. Cosi facendo però mi viene generato questo errore invalid type code: AC e dovrebbe esser dovuto al fatto che apro piu volte lo stream ObjectOutputStream, o sbaglio?
    Sfortunatamente, per come è stato definito il "protocollo" binario della serializzazione, NON funziona in "append".

    Anonymous_User ha scritto:


    C'è un modo per risolvere?
    Basta leggere tutto, tenerlo in memoria, fare modifiche/aggiunte, quindi RIscrivere tutto su file. A questo riguardo i tuoi metodi non vanno molto bene, perché Scrivifile riceve un Parco mentre Leggidati non restituisce alcun oggetto. Insomma, sono molto "sbilanciati" e per niente simmetrici.
  • Re: Problema programma creazione file

    Ciao andbin, ho provato ad eliminare la classe dove ho implementato l'array di oggetti e il relativo metodo per l'inserzione delle auto e l'ho invece inseriti all'interno della classe I/O. Cosi facendo, senza settare append a true, mi trascrive tutte le auto presenti nell'array sul file, proprio come se le accodasse e quindi senza sovrascrivere, invece nel caso di prima , ciò non avveniva. Forse perchè facevo gestire l'array mediante l'istanza della classe dove era stato implementato e ora no? Non capisco...
  • Re: Problema programma creazione file

    Anonymous_User ha scritto:


    invece nel caso di prima , ciò non avveniva. Forse perchè facevo gestire l'array mediante l'istanza della classe dove era stato implementato e ora no? Non capisco...
    Prima nel Leggidati() stampavi già i dati e non potevi fare altro (essendo void). È chiaro che così potevi solo sovra-scrivere il file con il Scrivifile().
Devi accedere o registrarti per scrivere nel forum
14 risposte