Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di Zama
    Registrato dal
    Apr 2007
    Messaggi
    14

    [JAVA] Interagire con file binari

    Ho un problemino:
    ho creato un programmino che deve poter scrivere e prelevare record da un file binario in momenti diversi. Visto che i dati sono pochi non ho bisogno di un DB. Per scrivere e leggere gli oggetti uso rispettivamente le classi ObjectOutputStream e ObjectInputStream.
    Ho notato che se faccio una sorta di "append" come nei file di testo a fine file quando devo inserire un oggetto, quando lo vado a leggere poi mi dice che il file è corrotto.

    questo è il mio metodo di scrittura file:
    (penso che il problema sia nell'aggiornamento del file quando aggiungo nuovi oggetti al suo interno)

    public void toFile(){
    ObjectOutputStream outputStream;
    File dir = new File("data");
    if (!(dir.exists()))
    dir.mkdir();
    try {
    // uso true come parametro per inserire a fine file un nuovo oggetto
    outputStream = new ObjectOutputStream(new FileOutputStream("data/record.data",true));
    outputStream.writeObject(this);
    outputStream.flush();
    outputStream.close();
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    System.err.println(e.getMessage());
    e.printStackTrace();
    }
    }

    nella lettura del file, dopo che preleva il primo record, al secondo ciclo mi da questo errore:

    java.io.StreamCorruptedException: invalid type code: AC
    at java.io.ObjectInputStream.readObject0(ObjectInputS tream.java:1356)
    at java.io.ObjectInputStream.readObject(ObjectInputSt ream.java:351)
    at zama.data.Contatto.readFromFile(Contatto.java:65)
    at zama.data.Contatto.main(Contatto.java:101)

    Possibile che non veda il file come se gli avessi semplicemente "appeso" in coda un altro oggetto?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] Interagire con file binari

    Originariamente inviato da Zama
    Possibile che non veda il file come se gli avessi semplicemente "appeso" in coda un altro oggetto?
    La questione è molto semplice: il processo di serializzazione inserisce all'inizio un "header" iniziale particolare. Poi seguono tutti gli oggetti serializzati.
    Facendo un "append" e aggiungendo altri oggetti, quel header viene nuovamente inserito.
    Quando il processo di de-serializzazione legge dallo stream, si trova ad un certo punto con dei dati (l'header iniziale) che non corrispondono a quello che si aspetta, pertanto lo segnala come corrotto.

    Morale della favola: con ObjectOutputStream non puoi appendere dati. Soluzioni per "aggirare" questo problema: leggere tutti gli oggetti, metterli in una collezione e poi riscrivere per intero il file, oppure scrivere un nuovo file, quindi muoverlo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di Zama
    Registrato dal
    Apr 2007
    Messaggi
    14
    temevo una cosa del genere.

    quindi non mi rimane che serializzare una collezione di oggetti e salvarla su file completa, successivamente prelevarla fare i miei lavori su di essa e poi sovrascrivere il file con la collezione completa modificata.

    grazie mille!!!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Zama
    quindi non mi rimane che serializzare una collezione di oggetti e salvarla su file completa, successivamente prelevarla fare i miei lavori su di essa e poi sovrascrivere il file con la collezione completa modificata.
    Questa è una soluzione ma non l'unica.

    Se proprio non vuoi usare un database, nulla ti vieta di salvare i dati in un "tuo" formato che potrebbe essere testuale o binario. Dipende da cosa devi salvare.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di Zama
    Registrato dal
    Apr 2007
    Messaggi
    14
    una piccola mailinglist per il sito del nostro gruppo senza troppi fronzoli. Nel file avrei dovuto salvare i contatti..se poi fossero diventati parecchi avrei studiato di salvarli su DB che forse è la soluzione più logica.

    Volevo fare una cosa veloce veloce, ma a conti fatti mi sa che forse è meglio appoggiarsi ad un DB.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.