Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    scrivere oggetti in un file binario

    Ciao a tutti,
    mi trovo a scrivere un programmino per la gestione di dizionari.
    Il problema è che a inizio e fine programma dovrei rispettivamente salvare tutti i dizionari (nell'oggetto lista) su file e aprire da file salvato la volta successiva.
    Mi sono letto veramente molta roba sulla serializzazione, su come si fa l'input e l'output ma non riesco a far funzionare il discorso.

    quando vado a fare la scrittura ad esempio mi dice che non può usare
    os.writeObject(lista);
    in quanto lista è di tipo Archivio (che ho creato io)

    in input invece

    l1= is.readObject();

    mi dice che il metodo readObject non esiste.

    Qualcuno può darmi una mano? Di seguito il codice in questione :

    codice:
    import java.util.Vector; import java.io.*; public class ArchivioMain { public static void main(String[] args){ //inizio prova lettura String nfileapri=Input.readString("Inserisci il nome del file da aprire. Lascia vuoto per un file nuovo. "); FileInputStream fin = null; try { fin = new FileInputStream(nfileapri); } catch(Exception e){ System.out.println("Creazione nuovo file"); } DataInputStream is = new DataInputStream(fin); int i2; Archivio l1; try { i2 = is.readInt(); l1= is.readObject(); // error is.close(); System.out.println(i2); } catch (Exception e){ System.out.println(""); } //fine prova lettura Archivio lista= new Archivio(); char scelta=' '; System.out.println("Benvenuto in dizionario 1.0 di Albertini Niccolò e Jacopo Baldini"); while(scelta != '4'){ System.out.println(" "); System.out.println("[1] Inserisci Dizionario"); System.out.println(" "); System.out.println("[2] stampa "); System.out.println(" "); System.out.println("[3] cancella"); System.out.println(" "); System.out.println("[4] Esci e salva"); System.out.println(" "); System.out.println("Cerca nei dizionari: inserisci la lettera per ricercare per: [n]Nome [l]Lingua [t]Termini [s]Sinonimi [c]Contrari "); System.out.println(" "); scelta = Input.readChar("----> "); if (scelta=='1'){ String nome= Input.readString("Nome dizionario: "); String lingua= Input.readString("Lingua: "); int nt = Input.readInt("Quanti termini vuoi inserire? "); int i=0; Vector term = new Vector(); for (i=0;i<nt;i++){ String descrizione= Input.readString("Descrizione: "); String sinonimi= Input.readString("Sinonimi: "); String contrari= Input.readString("Contrari: "); Termine c= new Termine(descrizione,sinonimi,contrari); term.add(c); } lista.add(nome,lingua,term); } if (scelta=='n'){ String cercadiz=Input.readString("Inserisci nome dizionario: "); lista.mostra1(cercadiz); } if (scelta=='l'){ String cercalingua=Input.readString("Inserisci la lingua: "); lista.mostra2(cercalingua); } if (scelta=='t'){ String cercater=Input.readString("Termine da ricercare: "); lista.mostra3(cercater); } if (scelta=='s'){ String cercasin=Input.readString("Sinonimo da ricercare: "); lista.mostra4(cercasin); } if (scelta=='c'){ String cercacon=Input.readString("Contrario da ricercare: "); lista.mostra5(cercacon); } if (scelta=='2'){ lista.mostra(); } if (scelta=='3'){ lista.mostra(); int x = Input.readInt("Quale dizionario vuoi cancellare? ")-1; lista.remove(x); } } //inzio prova scrittura String nfilesalva=Input.readString("Inserisci il nome del file dove salvare "); FileOutputStream fs = null; try { fs = new FileOutputStream(nfilesalva); } catch(Exception e){ System.out.println("Apertura fallita"); System.exit(1); } DataOutputStream os = new DataOutputStream(fs); try { os.writeInt(12); os.writeObject(lista); //error os.close(); } catch (Exception e){ System.out.println("Scrittura fallita"); System.exit(2); } //fine prova scrittura } }
    ho provato anche con implement serializable; ma niente.

    ringrazio in anticipo chi mi vorrà rispondere.
    grazie ciao

  2. #2

    Re: scrivere oggetti in un file binario

    Originariamente inviato da niccoleo
    quando vado a fare la scrittura ad esempio mi dice che non può usare
    os.writeObject(lista);
    in quanto lista è di tipo Archivio (che ho creato io)

    in input invece

    l1= is.readObject();

    mi dice che il metodo readObject non esiste.
    Il metodo readObject (risp. writeObject) appartiene alla classe ObjectInputStream (risp. ObjectOutputStream) e non alla classe DataInputStream (risp. DataOutputStream).

  3. #3
    Originariamente inviato da VincenzoTheBest
    Il metodo readObject (risp. writeObject) appartiene alla classe ObjectInputStream (risp. ObjectOutputStream) e non alla classe DataInputStream (risp. DataOutputStream).
    grazie!

    sono riuscito a far funzionare la scrittura. per la lettura ho un problema di differenza di tipo.
    come fare a deserializzare un oggetto di un tipo inventato da me? (ARCHIVIO)
    di seguito il codice aggiornato.

    codice:
    import java.util.Vector; import java.io.*; public class ArchivioMain implements Serializable { public static void main(String[] args){ char com=' '; com=Input.readChar("premi [a] per aprire un file esistente.[c] per continuare "); if (com=='a'){String nf=Input.readString("inserisci il nome del file salvato "); apri(nf);}; Archivio lista= new Archivio(); char scelta=' '; while(scelta != '5'){ System.out.println(" "); System.out.println("[1] Inserisci Dizionario"); System.out.println(" "); System.out.println("[2] stampa "); System.out.println(" "); System.out.println("[3] cancella"); System.out.println(" "); System.out.println("[4] Salva"); System.out.println(" "); System.out.println("[5] Esci"); System.out.println(" "); System.out.println("Cerca nei dizionari: inserisci la lettera per ricercare per: [n]Nome [l]Lingua [t]Termini [s]Sinonimi [c]Contrari "); System.out.println(" "); scelta = Input.readChar("----> "); if (scelta=='1'){ String nome= Input.readString("Nome dizionario: "); String lingua= Input.readString("Lingua: "); int nt = Input.readInt("Quanti termini vuoi inserire? "); int i=0; Vector term = new Vector(); for (i=0;i<nt;i++){ String descrizione= Input.readString("Descrizione: "); String sinonimi= Input.readString("Sinonimi: "); String contrari= Input.readString("Contrari: "); Termine c= new Termine(descrizione,sinonimi,contrari); term.add(c); } lista.add(nome,lingua,term); } if (scelta=='n'){ String cercadiz=Input.readString("Inserisci nome dizionario: "); lista.mostra1(cercadiz); } if (scelta=='l'){ String cercalingua=Input.readString("Inserisci la lingua: "); lista.mostra2(cercalingua); } if (scelta=='t'){ String cercater=Input.readString("Termine da ricercare: "); lista.mostra3(cercater); } if (scelta=='s'){ String cercasin=Input.readString("Sinonimo da ricercare: "); lista.mostra4(cercasin); } if (scelta=='c'){ String cercacon=Input.readString("Contrario da ricercare: "); lista.mostra5(cercacon); } if (scelta=='2'){ lista.mostra(); } if (scelta=='3'){ lista.mostra(); int x = Input.readInt("Quale dizionario vuoi cancellare? ")-1; lista.remove(x); } if (scelta=='4'){ String nomefile = Input.readString("Inserisci il nome del file dove salvare "); salva(lista,nomefile); } } } private static void salva (Archivio lista, String nomefile) { try { FileOutputStream ostream = new FileOutputStream(nomefile); ObjectOutputStream p = new ObjectOutputStream(ostream); p.writeObject(lista); p.flush(); ostream.close(); } catch (Exception e) {System.out.println("Scrittura fallita "+e);} } private static Archivio apri(String nomefile) { Archivio obj=new Archivio(); try { FileInputStream istream = new FileInputStream(nomefile); ObjectInputStream p = new ObjectInputStream(istream); obj=p.readObject(); istream.close(); return obj; } catch (Exception e) { System.out.println("lettura "+e);return null;} } }

  4. #4
    Originariamente inviato da niccoleo
    come fare a deserializzare un oggetto di un tipo inventato da me? (ARCHIVIO)
    Nel momento in cui leggi l'oggetto ti basta fare un cast:
    codice:
    Archivio obj = (Archivio) p.readObject()
    P.S. La prossima volta non incollare il codice nella finestra, incollalo direttamente tra i tag CODE, altrimenti compare tutto su una riga.

  5. #5
    Originariamente inviato da VincenzoTheBest
    Nel momento in cui leggi l'oggetto ti basta fare un cast:
    codice:
    Archivio obj = (Archivio) p.readObject()
    P.S. La prossima volta non incollare il codice nella finestra, incollalo direttamente tra i tag CODE, altrimenti compare tutto su una riga.
    non ci crederai,ma mi sono accorto poco dopo aver scritto l'intervento che eclipse mi suggeriva proprio il cast!! grazie ancora per prima!

  6. #6
    Originariamente inviato da niccoleo
    non ci crederai,ma mi sono accorto poco dopo aver scritto l'intervento che eclipse mi suggeriva proprio il cast!! grazie ancora per prima!
    di nulla

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.