Visualizzazione dei risultati da 1 a 10 su 10

Discussione: file .dat in java

  1. #1

    file .dat in java

    ciao a tutti!!

    ho crato un metodo che mi permette di scrivere un'oggetto all'interno di un file. dat
    in scrittura non c'è nessun problema ma la lettura mi fa visualizzare solo il primo oggetto.

    il metodo per la lettura è il seguente:

    public void leggi_file() throws ClassNotFoundException
    { persona p=new persona();
    try
    {
    FileInputStream x=new FileInputStream("persone.dat");
    ObjectInputStream ois =new ObjectInputStream(x);
    p=(persona) ois.readObject();
    System.out.println(p.nome+"\t"+p.cognome);
    }

    catch (IOException e1)
    {
    e1.printStackTrace();
    }
    }

    se provo a ripetere la stessa istruzione(di lettura del file) più volte mi ritorna sempre lo stresso risultato!!

    come si può spostare la testina per leggere l'oggetto successivo? in c++ c'era il metodo seekg.

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

    Re: file .dat in java

    Originariamente inviato da the_dariuz
    se provo a ripetere la stessa istruzione(di lettura del file) più volte mi ritorna sempre lo stresso risultato!!
    Non hai postato il codice per la scrittura degli oggetti .... ma oggi mi sento fortunato e provo ad indovinare.

    Nella parte di scrittura serializzi più volte lo stesso identico oggetto persona, cambiando di volta in volta solo il suo "stato" (con setter setQualcosa()).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    da quel che ho capito tu dici che c'è un errore nella scrittura giusto? ma se apro un file con un editor di testo riesco a vedere tutte le informazioni memorizzate in precedenza!con i più oggetti(con informazioni diverse)memorizzati!!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,280
    Originariamente inviato da the_dariuz
    ma se apro un file con un editor di testo riesco a vedere tutte le informazioni memorizzate in precedenza!
    A parte che la serializzazione ha un formato "binario" ... quindi se lo apri con un editor di testo vedi anche una accozzaglia di altra roba strana ....

    Originariamente inviato da the_dariuz
    con i più oggetti(con informazioni diverse)memorizzati!!
    Ma prima hai detto che "vedi" sempre lo stesso risultato ..... allora posta il codice di scrittura che vediamo .... quello che ho detto io prima è uno dei tipici problemi che si hanno quando non si conosce bene come funziona la serializzazione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    questa è la classe persona:

    public class persona implements Serializable
    {
    public String nome;
    public String cognome;
    }

    questo è il metodo per la scrittura su file:

    public void scrivi_file(String nome,String cognome)
    {
    p.nome=nome;
    p.cognome=cognome;

    try
    { FileOutputStream x=new FileOutputStream("persone.dat",true);
    ObjectOutputStream oos =new ObjectOutputStream(x);
    oos.writeObject(p);
    oos.close();
    }
    catch (IOException e1)
    {
    e1.printStackTrace();
    }
    }

    alla funzione di lettura ho provato a mettere di nuovo questa istruzione dopo che mi dà il primo risultato=(persona) ois.readObject();

    dopo il primo risultato cioè nome e cognome la seconda volta mi torna questo:

    java.io.StreamCorruptedException: invalid type code: AC
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at principale.file.leggi_file(file.java:42)
    at principale.pricipale.main(pricipale.java:12)

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,280
    Originariamente inviato da the_dariuz
    FileOutputStream x=new FileOutputStream("persone.dat",true);

    alla funzione di lettura ho provato a mettere di nuovo questa istruzione dopo che mi dà il primo risultato=(persona) ois.readObject();

    dopo il primo risultato cioè nome e cognome la seconda volta mi torna questo:

    java.io.StreamCorruptedException: invalid type code: AC
    Ahhh ma allora dovevi specificarlo prima che ti dà StreamCorruptedException ..... spiegati bene!!!

    Comunque questo è un altro problema quando non si conosce bene come funziona la serializzazione.
    Te lo dico un po' brutalmente .... la serializzazione non funziona in append!!!!

    Vuoi sapere il perché? Quando la serializzazione inizia, scrive 2 byte di header di marcatura. Se tu appendi ottieni una cosa del tipo:

    <header> ....<oggetti>.... <header> ....<oggetti>....

    Quando rileggi lo stream il primo header è ok, dal momento che correttamente marca l'inizio dello stream. Ma appena si trova un ulteriore header, che non si aspetta .... beh, hai capito.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Ciao!! ora ho risolto il prblema della scrittura e della lettura!!ora nel file avviene una scrittura corretta!!!però....


    se volessi scrivere nello stesso file in un secondo momento come faccio ad evitare che venga inserito un ulteriore <header> e che continui la sequenza di oggetti?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,280
    Originariamente inviato da the_dariuz
    se volessi scrivere nello stesso file in un secondo momento come faccio ad evitare che venga inserito un ulteriore <header> e che continui la sequenza di oggetti?
    a) Leggi tutti gli oggetti e li metti in una struttura dati in memoria, quindi sovrascrivi il file e scrivi tutti gli oggetti più quelli da aggiungere

    oppure

    b) Leggi gli oggetti dal file e man mano li serializzi su un nuovo file, poi scrivi gli oggetti da aggiungere. Alla fine il vecchio file lo puoi cancellare e/o il nuovo lo puoi rinominare con il nome del vecchio file.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    grazie delle dritte!!

    cmq anche io avevo pensato delle cose simili...ma non esistono modi più efficenti?sono operazioni che richiedono abbastanza tempo estrarre dal file e riscrivere nel file oppure fare una copia di un altro file no?

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,280
    Originariamente inviato da the_dariuz
    ma non esistono modi più efficenti?
    Riferiti in modo specifico per la serializzazione, i due metodi che ho detto sono quelli più "logici" e "puliti".

    Originariamente inviato da the_dariuz
    sono operazioni che richiedono abbastanza tempo estrarre dal file e riscrivere nel file oppure fare una copia di un altro file no?
    Beh ma dipende da cosa devi fare di preciso e da quanti dati devi gestire!!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.