Oppure

Loading
01/02/09 15:30
Cesaruz
Ciao a tutti...ho un problema sulla lettura dal file di oggetti...allora io ho un file dove vado a salvare degli oggetti serializabili(quindi persistenti) solo che all'avio del programma quando vado a recuperare i vari oggetti salvati in precedenza mi va in eccezzione :( :
Errore: java.io.StreamCorruptedException: invalid type code: AC

Che cosa significa?E come lo risolvo?
Grazie anticipatamente a tutti...:k:
aaa
04/02/09 18:18
netarrow
Senza codice, non possiamo aiutarti.
Mostraci come salvi e come carichi.
Cmq io personalmente non ho mai serializzato più di un oggetto per file. Se avevo più oggetti da serializzare li mettevo in un vettore e serializzavo il vettore.
aaa
06/02/09 7:00
Cesaruz
OK ora ti metto il codice...
 public static void main(String[] args)throws Exception {
        //boolean pieno=false;
        //creazione del file 
        File f = new File("Libr.txt");
        File fo = new File("Libri.dat");
       // File o = new File("Libri.dat");
        //Stream di input per file di oggtti  
        if(f.canWrite()){
            System.out.println("Si puo scrivere ");
        }
        //Input per i file bufferizzati
        FileReader lettura = new FileReader(f);
        BufferedReader leggobuf = new BufferedReader(lettura);
        
        //Stream di output per file bufferizzati       
        BufferedWriter scr =new BufferedWriter(new FileWriter(f,true));
        //Stream di output file di oggetti       
        //FileOutputStream fout = new FileOutputStream(o,true);
        ObjectOutputStream writ = new ObjectOutputStream(new FileOutputStream(fo,true));
        FileInputStream fin=new FileInputStream(fo);
        ObjectInputStream leggo=new ObjectInputStream(fin);
       // RandomAccessFile leggor = new RandomAccessFile("Libr.dat","rw");
        //Accesso alla tastiera     
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        // Main Libreria       
        Libro L=new Libro();//Oggetto libro per l'acquisizione
        Gestione_Libreria Libr = new Gestione_Libreria(100);       //Oggeto gestione libri che rappresenta il vettore dei libri        
        try{
            Libro l= new Libro();
            System.out.println("Leggo da file... ");           
            try{                
                while(true){
                    try{
                        l = (Libro)leggo.readObject();
                        Libr.setLibro(l);
                        Libr.incrementa();
                        System.out.println(l.ToString());
                    }catch(EOFException ex){
                        break;
                    }
                   // n--;
                }
                leggo.close();
            }finally{
                System.out.println("Tentativo di lettura...");
            }
        }catch(Exception ex){
                System.out.println("Attenzione :"+ex);
        }

Inquesta parte dichiaro i vari stream di input e di output e poi ricarico i vari oggetti nel mio vettore...
Ora il salvataggio...
System.out.println("Salvo su file...");
                    writ.write(Libr.getNlibri());
                    scr.write(Libr.getNlibri());
                    for(int i =0;i<Libr.getNlibri();i++){
                        scr.write("---------------------------");
                        scr.write(Libr.getLibro(i).ToString());                       
                        scr.write("\n---------------------------");
                        scr.newLine();
                        writ.writeObject(Libr.getLibro(i));
                    }
                    scr.close();

Ok qui salvo...ci sono delle classi che uso per gestire il vettore ed i vari oggetti...se possono servire ditemelo che le posto...
Grazie anticipatamente a tutti:k:
aaa
06/02/09 10:13
netarrow
invece di serializzare per ogni oggetto, inserisci ogni oggetto in un Vector, e poi serializza un'unica volta l'oggetto Vector.
aaa
06/02/09 18:09
Cesaruz
Senti ho provato ma non sono ancora riuscito...mi lacia sempre lo stesso tipo di eccezzione... comunque ora ti posto il codice probabilmente ho sbagliato qualcosa.:(
Questo lo uso per leggere:
 Vector v = new Vector(1,1);
        try{
             while(true){
                try{
                    v= (Vector)leggo.readObject();
                }catch(EOFException e){
                    break;
                }
             }
             leggo.close();
        }catch(Exception ex){
            System.out.println("Attenzione : "+ex);
        }

E questo per salvare:
 for(int i =0;i<Libr.getNlibri();i++){
                        v.add(Libr.getLibro(i));
                        scr.write("---------------------------");
                        scr.write(Libr.getLibro(i).ToString());                       
                        scr.write("\n---------------------------");
                        scr.newLine();
                        //writ.writeObject(Libr.getLibro(i));
                    }
 writ.writeObject(v);

l'eccezzione in lettura è sempre la stessa:
java.io.StreamCorruptedException: invalid type code: AC
Grazie anticipatamente a tutti.
:k:
Ultima modifica effettuata da Cesaruz 06/02/09 18:10
aaa
06/02/09 22:27
netarrow
che sia writ che non viene chiuso con close?
se non è neanche questo metti come allegato il progetto e quando ho tempo lo provo.
aaa
10/02/09 18:05
Cesaruz
Ok grazie..ora funziona avevo sbagliato la chiusura dello strea...:k:
Cmq ora avrei un'altra domanda... per i file di testo quindi di caratteri per la lettura utlizzo il metodo readLine() che mi restituisce una stringa con l'intera linea...però come faccio a smettere di leggere dal file???Nel senso come faccio a capire che non c'è più niente da leggere??La IOException mi pare che non viene lanciata...
Grazie in anticipo a tutti...
aaa
11/02/09 8:20
netarrow
capisci che il file è finito quando readLine ti ritorna null
aaa