PDA

View Full Version : [JAVA]scrivere oggetti in un file binario


niccoleo
08-06-2011, 15:01
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.

EDIT

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


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(); //QUA L'ERRORE. NON POSSO CONVERTIRE UN OGGETTO IN ARCHIVIO(IL MIO TIPO).COME RISOLVERE?

istream.close();

return obj;

} catch (Exception e) { System.out.println("lettura "+e);return null;}

}

}














ho provato anche con implement serializable; ma niente.

ringrazio in anticipo chi mi vorrà rispondere.
grazie ciao

DvL^Nemo
08-06-2011, 15:11
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 :

ho provato anche con implement serializable; ma niente.

ringrazio in anticipo chi mi vorrà rispondere.
grazie ciao


Un'occhiata al javadoc no eh ?
http://download.oracle.com/javase/6/docs/api/java/io/DataInputStream.html

niccoleo
08-06-2011, 15:13
Un'occhiata al javadoc no eh ?
http://download.oracle.com/javase/6/docs/api/java/io/DataInputStream.html

si ho letto anche questo, infatti cercavo soluzione a come ovviare al problema di differenza di tipo.
almeno da quello che ho capito..
sai darmi un consiglio?
grazie!

EDIT

ho aggiornato il post in alto

Mixmar
08-06-2011, 21:03
Stando a quanto è scritto qui (http://download.oracle.com/javase/6/docs/api/java/io/ObjectInputStream.html), "Archivio" dovrebbe implementare Serializable: è così?

niccoleo
08-06-2011, 22:37
Stando a quanto è scritto qui (http://download.oracle.com/javase/6/docs/api/java/io/ObjectInputStream.html), "Archivio" dovrebbe implementare Serializable: è così?

si, comunque ho risolto con un cast di da object a archivio:
codice corretto

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 --> ");


Archivio lista= new Archivio();
String nf="";
if (com=='a') {nf=Input.readString("Inserisci il nome del file salvato --> "); lista = (Archivio) apri(nf);} //HO MESSO UN CAST COME SUGGERITO DA Eclipse.ripassare cast

char scelta=' ';
System.out.println(" ");
System.out.println("Benvenuto in dizionario 1.0 di Albertini Niccolò e Jacopo Baldini");
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 Object apri(String nomefile) {
Object obj=new Object();
try {
FileInputStream istream = new FileInputStream(nomefile);
ObjectInputStream p = new ObjectInputStream(istream);

obj=p.readObject();

istream.close();

return obj;

} catch (Exception e) { System.out.println("Errore lettura "+e);return null;}

}

}