[JAVA] java.io.StreamCorruptedException: invalid type code: AC

di il
7 risposte

[JAVA] java.io.StreamCorruptedException: invalid type code: AC

Ciao a tutti!!

Sto "lavorando" ad un progetto JavaFX e sono incappato su problema che non riesco a venirne a capo. In poche parole devo implementare una Login/Registration page che una volta effettuata la funzione di log-in/sign-in mi riporta alla Homepage del progetto. Ho implementato la classe User (implements Serializable) e nella classe di test ho creato i due handle dei bottoni di Registrazione e di Login. Fondamentalmente con Registrazione scrivi su file(attraverso ObjectOutputStream fos = new ObjectOutputStream(new FileOutputStream(nomeFile, true)); e con il metodo di scrittura writeObject() ) e con Login legge il file e controlla le credenziali inserite dall'utente (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(nomeFile))).

Una volta che vado a mettere il readObject() all'interno di un ciclo per "scorrere" il file di testo con all'interno tutte le credenziali registrate, mi lancia l'eccezione java.io.StreamCorruptedException: invalid type code: AC. Cioè si ferma alla prima riga e poi fine.
Per capire lascio qua la parte di codice in cui mi dava errore( qui stavo facendo dei test su un "progetto di prova" concettualmente non cambia perchè l'idea è quella di inserire da file tutti gli utenti su un array list e poi scorrerlo per trovare le credenziali corrette ed effettuare il login)
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(nomeFile));

        ArrayList<User> list = new ArrayList<User>();
        User u;
        while ((u = (User) ois.readObject()) != null) list.add(u);
Spero di essermi fatto capire e grazie dell'aiuto in anticipo

7 Risposte

  • Re: [JAVA] java.io.StreamCorruptedException: invalid type code: AC

    Bolo96 ha scritto:


    attraverso ObjectOutputStream fos = new ObjectOutputStream(new FileOutputStream(nomeFile, true));
    true = modalità "append". La serializzazione degli oggetti NON funziona in "append" (e non è stata pensata per tale utilizzo). La serializzazione utilizza un "protocollo" binario ben preciso che prevede all'inizio un "header" di 4 byte. Quindi se si riapre lo stream in output più volte sullo stesso file si ha es.:

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

    Quando ObjectInputStream rilegge il file: il primo header è ovviamente ok, ma il secondo header NON se lo aspetta e ritiene che lo stream sia appunto "corrotto".

    Ripeto: la serializzazione non va usata così. Dovresti rileggere tutti gli oggetti in memoria, fare le modifiche e riscrivere l'intero file.
  • Re: [JAVA] java.io.StreamCorruptedException: invalid type code: AC

    Grazie Mille della risposta e del chiarimento sulla serializzazione. Avevo usato la modalità append,anche perchè me la suggeriva il libro di testo, perchè mi consentiva di aggiungere righe al file di testo(quello che funge da una sorta di DB degli user registrati), altrimenti mi andava a sovrascrivere il file. Quindi come faccio a leggere un file di oggetti che contiene piu righe, senza che mi vada a corrompere il file??
  • Re: [JAVA] java.io.StreamCorruptedException: invalid type code: AC

    Bolo96 ha scritto:


    perchè me la suggeriva il libro di testo, perchè mi consentiva di aggiungere righe al file di testo
    Per file di TESTO puro sì, l'append è ok. Ma con la serializzazione degli oggetti non hai un file di testo!

    Bolo96 ha scritto:


    Quindi come faccio a leggere un file di oggetti che contiene piu righe, senza che mi vada a corrompere il file??
    L'ho detto (per la serializzazione) nel mio precedente messaggio, al fondo.

    Ma alla fine mi pare che fai un po' di confusione: vuoi un file di testo ... o un file binario (e in modo specifico per la serializzazione)??
  • Re: [JAVA] java.io.StreamCorruptedException: invalid type code: AC

    Probabilmente mi sono espresso male.
    Ti cito la consegna del progetto così ci capiamo:
    L’agenda dovrà essere aperta introducendo il nome utente e la parola d’ordine.
    La prima volta che si utilizza l’applicativo l’utente deve essere invitato a registrarsi
    con nome utente e password. La prima volta che si lancia l’applicativo si dovrà aprire una finestra che invita ad
    inserire, su due aree di testo, il nome utente e la password con cui si accederà le
    volte successive all’applicazione. Nei successivi ingressi si dovrà effettuare la
    verifica dei dati immessi nelle aree di testo del login.
    La mia idea iniziale è che una volta lanciato l'applicativo venga aperta la login page dove compariranno i 2 textfield(user + password) e i 2 bottoni di registrazione e login. Io pensavo ad un file che potesse immagazzinare questi dati cosicchè la volta successiva possa effettuare i controlli di login,tramite i metodi di lettura.

    Spero di essermi fatto capire perchè sono ad un buon punto ma mi sono completamente bloccato e ho la consegna tra 2 giorni T.T
  • Re: [JAVA] java.io.StreamCorruptedException: invalid type code: AC

    Quindi su file vuoi memorizzare solo un singolo username e la corrispondente password ?
    Non possono esserci più username validi a quanto ho capito dalla tua spiegazione ...

    Se è così io utilizzerei un singolo file di testo, piuttosto che la serializzazione.

    Semmai il tuo problema sarebbe non esporre "in chiaro" i dati dell' utente su file, ma per questo non ti viene incontro la serializzazione, le stringhe se non sbaglio sono comunque visibili aprendo un editor di testo.

    Se la tua è un' applicazione di prova e non devi preoccuparti di aspetti legati alla sicurezza io scriverei semplicemente un file di testo di due righe con username nella prima riga e password nella seconda.

    In questo modo non ti serve la serializzazione e non devi preoccuparti dell' append, ti basta scrivere il tuo file di testo con un PrintWriter (o un BufferedWriter), e leggere le righe ad es. con BufferedReader.

    Se hai esigenze diverse precisa meglio
  • Re: [JAVA] java.io.StreamCorruptedException: invalid type code: AC

    Bolo96 ha scritto:


    L’agenda dovrà essere aperta introducendo il nome utente e la parola d’ordine.
    La prima volta che si utilizza l’applicativo l’utente deve essere invitato a registrarsi
    con nome utente e password. La prima volta che si lancia l’applicativo si dovrà aprire una finestra che invita ad
    inserire, su due aree di testo, il nome utente e la password con cui si accederà le
    volte successive all’applicazione. Nei successivi ingressi si dovrà effettuare la
    verifica dei dati immessi nelle aree di testo del login.
    Questo spiega solo dal punto di vista funzionale. Ma NON dice come/dove devono essere salvati i dati.

    Bolo96 ha scritto:


    Io pensavo ad un file che potesse immagazzinare questi dati
    Sì, un file ok ma le possibilità sono molte:
    - un file di testo puro con una strutturazione dei dati a tua scelta.
    - un file XML o JSON (che sono file di testo ma con una specifica struttura)
    - un file di "properties" (vedi java.util.Properties) che è anch'esso un file di testo con dati chiave=valore
    - un file binario con una strutturazione dei dati a tua scelta. (sconsigliato)
    - un file binario con la "serializzazione degli oggetti"
    - un DB "embedded" (Apache Derby, HSQLDB o altro)
  • Re: [JAVA] java.io.StreamCorruptedException: invalid type code: AC

    Ok. Ho riletto meglio la consegna e probabilmente è stata una svista mia ho letto serializzare i dati dove non c'era ahahah. Quindi ieri sera ho fatto semplicemente una registrazione e un login tramite scrittura e lettura dei dati su un file di testo e tutto funziona. Grazie mille dell'aiuto. Potete tranquillamente chiudere la discussione.
Devi accedere o registrarti per scrivere nel forum
7 risposte