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

    Problema Sviluppo Rubrica

    Ciao sto sviluppando una rubrica in java, per ora è a consolle... Cmq volevo poter salvare i dati su un file per poter ricaricarli ogni volta che voglio...
    Però riesco solo a salvare ma poi non riesco a ricaricare i dati e a stamparli...

    Vi posto i sorgenti:

    File JPhoneBook.java


    codice:
    import java.io.*;
    public class JPhoneBook {
    	private String Nome;
    	private String Numero;
    	
    	public JPhoneBook(){}
    	
    	public JPhoneBook(String Nome, String Numero){
    		this.Nome = Nome;
    		this.Numero = Numero;
    	}
    	
    
    	public void aggiungiContatto(JPhoneBook JContact){
    		try{ 
    
    			FileOutputStream f = new FileOutputStream("Contatti.dat",true);// true serve per aprire il file in modalità append// 
    			ObjectOutputStream fout = new ObjectOutputStream(f); 
    			fout.writeObject(JContact.Nome + JContact.Numero); 
    			f.close(); 
    			}catch(Exception e){
    				System.out.print(e);
    			}
    	}
    	
    	public static void leggiContatti(){
    		JPhoneBook phoneBook;
    		
    		try{
    			FileInputStream fis = new FileInputStream("Contatti.dat");
    			ObjectInputStream In = new ObjectInputStream(fis);
    			while(true){
    				try{
    					phoneBook = (JPhoneBook)In.readObject();
    					System.out.println(phoneBook.Nome + " " + phoneBook.Numero);
    				}catch(EOFException E){
    					System.out.println("End of Contact");
    					break;
    				}
    			}
    		}catch(Exception e){
    			e.printStackTrace();
    		}
    	}
    	
    }
    File JMain.java

    codice:
    import java.io.*;
    public class JMain {
    
    	public static void main(String[] args){
    
    		InputStreamReader In = new InputStreamReader(System.in);
    		BufferedReader Input = new BufferedReader(In);
    		int selezione;
    		String Nome, Numero;
    		System.out.println("Premi 1 per aggiungere un contatto - 2 per stampare la lista dei contatti");
    		try{
    			selezione = Integer.parseInt(Input.readLine());
    			if(selezione == 1){
    				System.out.println("Inserisci il nome del contatto");
    				Nome = Input.readLine();
    				System.out.println("Inserisci il numero del contatto");
    				Numero = Input.readLine();
    				JPhoneBook JContact = new JPhoneBook(Nome, Numero);
    				JContact.aggiungiContatto(JContact);
    			}
    			if(selezione == 2){
    				JPhoneBook.leggiContatti();
    			}
    			
    		}catch(IOException E){
    			E.printStackTrace();
    		}
    			
    	}
    
    }
    Infatti quando chiamo il metodo leggiContatti();
    mi da questo errore:
    java.lang.ClassCastException: java.lang.String cannot be cast to JPhoneBook
    at JPhoneBook.leggiContatti(JPhoneBook.java:34)
    at JMain.main(JMain.java:22)

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: Problema Sviluppo Rubrica

    Originariamente inviato da ghezash
    Infatti quando chiamo il metodo leggiContatti();
    mi da questo errore:
    java.lang.ClassCastException: java.lang.String cannot be cast to JPhoneBook
    at JPhoneBook.leggiContatti(JPhoneBook.java:34)
    at JMain.main(JMain.java:22)
    Stai scrivendo su file stringhe (fout.writeObject(JContact.Nome + JContact.Numero);) ma quando poi vai al leggere casti a JPhoneBook (phoneBook = (JPhoneBook)In.readObject();), non va bene! Se scrivi stringhe devi poi leggere stringhe!
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

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

    Re: Problema Sviluppo Rubrica

    Originariamente inviato da ghezash
    Ciao sto sviluppando una rubrica in java, per ora è a consolle...
    No, mi spiace, non ci siamo ...

    1) Che cosa "modella" JPhoneBook? A prima vista, vedendo i campi di istanza nome/numero, sembrerebbe che modella 1 contatto.
    Ora, perché in una classe che dovrebbe essere solo un "bean" di 1 contatto ci dovrebbe essere un metodo per l'I/O aggiungiContatto?? E per lo stesso motivo, e anche peggio, perché ci dovrebbe essere un metodo leggiContatti??
    Questioni di "design" ....

    2) Non so perché stai cercando di usare la "serializzazione" degli oggetti (ObjectOutputStream e ObjectInputStream). Quello che devi sapere però è che la serializzazione non funziona (e non è stata pensata) per l' "append". Ovvero NON va bene che usi un FileOutputStream con flag append=true
    (e se ti domandi il perché, l'avevo spiegato qui).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4

    Re: Re: Problema Sviluppo Rubrica

    Originariamente inviato da andbin
    No, mi spiace, non ci siamo ...

    1) Che cosa "modella" JPhoneBook? A prima vista, vedendo i campi di istanza nome/numero, sembrerebbe che modella 1 contatto.
    Ora, perché in una classe che dovrebbe essere solo un "bean" di 1 contatto ci dovrebbe essere un metodo per l'I/O aggiungiContatto?? E per lo stesso motivo, e anche peggio, perché ci dovrebbe essere un metodo leggiContatti??
    Questioni di "design" ....

    2) Non so perché stai cercando di usare la "serializzazione" degli oggetti (ObjectOutputStream e ObjectInputStream). Quello che devi sapere però è che la serializzazione non funziona (e non è stata pensata) per l' "append". Ovvero NON va bene che usi un FileOutputStream con flag append=true
    (e se ti domandi il perché, l'avevo spiegato qui).
    No JPhoneBook è la classe che mi permette di creare i contatti, io posso farne quanti ne voglio non riesco a capire il perchè dici che ne posso fare uno solo... Io posso fare tutte le istanze che voglio xk quando al messaggio "premi 1 per..." io premo 1 lui crea un nuovo contatto...
    O meglio:
    Crea l'istanza a cui passa i valori Nome e Numero e poi in teoria dovrebbe salvarli in un file ma quella è la parte che non riesco a far funzionare bene...

  5. #5

    Re: Re: Problema Sviluppo Rubrica

    Originariamente inviato da Alex'87
    Stai scrivendo su file stringhe (fout.writeObject(JContact.Nome + JContact.Numero);) ma quando poi vai al leggere casti a JPhoneBook (phoneBook = (JPhoneBook)In.readObject();), non va bene! Se scrivi stringhe devi poi leggere stringhe!
    Ah ovvio xD
    Comunque ho provato a fare delle modifiche ma ora non riesco più nemmeno a salvare
    Ecco il nuovo sorgente della classe JPhoneBook


    codice:
    import java.io.*;
    public class JPhoneBook {
    	private String Nome;
    	private String Numero;
    	
    	public JPhoneBook(){}
    	
    	public JPhoneBook(String Nome, String Numero){
    		this.Nome = Nome;
    		this.Numero = Numero;
    	}
    	
    	public void aggiungiContatto(JPhoneBook JContact){
    		try{ 
    
    			FileOutputStream f = new FileOutputStream("Contatti.dat",true);// true serve per aprire il file in modalità append// 
    			ObjectOutputStream fout = new ObjectOutputStream(f); 
    			fout.writeObject(JContact); 
    			f.close(); 
    			}catch(Exception e){
    				e.printStackTrace();
    			}
    	}
    	
    	public static void leggiContatti(){
    		JPhoneBook phoneBook;
    		
    		try{
    			FileInputStream fis = new FileInputStream("Contatti.dat");
    			ObjectInputStream In = new ObjectInputStream(fis);
    			while(true){
    				try{
    					phoneBook = (JPhoneBook)In.readObject();
    					System.out.println(phoneBook.Nome + " " + phoneBook.Numero);
    				}catch(EOFException E){
    					System.out.println("End of Contact");
    					break;
    				}
    			}
    		}catch(Exception e){
    			e.printStackTrace();
    		}
    	}
    	
    }
    Ora l'errore è
    java.io.NotSerializableException: JPhoneBook
    at java.io.ObjectOutputStream.writeObject0(ObjectOutp utStream.java:1156)
    at java.io.ObjectOutputStream.writeObject(ObjectOutpu tStream.java:326)
    at JPhoneBook.aggiungiContatto(JPhoneBook.java:18)
    at JMain.main(JMain.java:19)

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: Re: Re: Problema Sviluppo Rubrica

    Originariamente inviato da ghezash
    Ora l'errore è
    java.io.NotSerializableException: JPhoneBook
    at java.io.ObjectOutputStream.writeObject0(ObjectOutp utStream.java:1156)
    at java.io.ObjectOutputStream.writeObject(ObjectOutpu tStream.java:326)
    at JPhoneBook.aggiungiContatto(JPhoneBook.java:18)
    at JMain.main(JMain.java:19)
    Per poter serializzare un oggetto la sua classe deve implementare java.io.Serializable.

    Ad ogni modo quello che hai scritto non ha molto senso, rileggi un attimo cosa ti ha scritto andbin :master:
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7

    Re: Re: Re: Re: Problema Sviluppo Rubrica

    Originariamente inviato da Alex'87
    Per poter serializzare un oggetto la sua classe deve implementare java.io.Serializable.

    Ad ogni modo quello che hai scritto non ha molto senso, rileggi un attimo cosa ti ha scritto andbin :master:
    Allora io ho fatto delle ultime modifiche alla classe JPhoneBook quindi te le posto qua:


    codice:
    import java.io.*;
    
    public class JPhoneBook {
    	private String Nome;
    	private String Numero;
    	
    
    	public JPhoneBook(){
    		InputStreamReader In = new InputStreamReader(System.in);
    		BufferedReader Input = new BufferedReader(In);
    		String Nome = null,Numero = null;
    		try{
    			System.out.println("Inserisci il nome del contatto");
    			Nome = Input.readLine();
    			System.out.println("Inserisci il numero del contatto");
    			Numero = Input.readLine();			
    		}catch(IOException e){
    			e.printStackTrace();
    		}
    		setNome(Nome);
    		setNumero(Numero);
    	}
    	
    	public void setNome(String Nome){
    		this.Nome = Nome;
    	}
    	
    	public void setNumero(String Numero){
    		this.Numero = Numero;
    	}
    	
    	
    	public void aggiungiContatto(JPhoneBook JContact){
    		try{ 
    
    			FileOutputStream f = new FileOutputStream("Contatti.dat",true);// true serve per aprire il file in modalità append// 
    			ObjectOutputStream fout = new ObjectOutputStream(f); 
    			fout.writeObject(JContact); 
    			f.close(); 
    			}catch(Exception e){
    				e.printStackTrace();
    			}
    	}
    	
    	public static void leggiContatti(){
    		JPhoneBook phoneBook;
    		
    		try{
    			FileInputStream fis = new FileInputStream("Contatti.dat");
    			ObjectInputStream In = new ObjectInputStream(fis);
    			while(true){
    				try{
    					phoneBook = (JPhoneBook)In.readObject();
    					System.out.println(phoneBook.Nome + " " + phoneBook.Numero);
    				}catch(EOFException E){
    					System.out.println("End of Contact");
    					break;
    				}
    			}
    		}catch(Exception e){
    			e.printStackTrace();
    		}
    	}
    	
    }
    E anche nel file JMain.java che è quello contenente il metodo main



    Comunque a che punto ti riferisci tra i 2 che ha scritto andbin?
    codice:
    import java.io.*;
    
    public class JMain {
    
    	public static void main(String[] args){
    
    		InputStreamReader In = new InputStreamReader(System.in);
    		BufferedReader Input = new BufferedReader(In);
    		int Selezione;
    		System.out.println("Premi 1 per aggiungere un contatto");
    		try{
    			Selezione = Integer.parseInt(Input.readLine());
    			if(Selezione == 1){
    				JPhoneBook phoneBook = new JPhoneBook();
    			}
    			if(Selezione == 2){
    				JPhoneBook.leggiContatti();
    			}
    			
    		}catch(IOException E){
    			E.printStackTrace();
    		}
    			
    	}
    
    }

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

    Re: Re: Re: Problema Sviluppo Rubrica

    Originariamente inviato da ghezash
    No JPhoneBook è la classe che mi permette di creare i contatti, io posso farne quanti ne voglio non riesco a capire il perchè dici che ne posso fare uno solo...
    Non ho detto che ne puoi fare solo 1!!! Ho detto che siccome la classe ha 2 campi di istanza nome/numero, allora 1 istanza "modella" 1 contatto. Ed è chiaro che puoi creare più istanze, quindi più contatti.

    E questo porta alla questione che dicevo. Se una classe ha già come responsabilità principale quella di modellare una entità .... perché devi fargli fare altro e di tutto e di più??

    Vuoi sapere come sarebbe più logico?
    - Una classe Contatto che modella solo 1 contatto. I campi per i dati, il costruttore/i che ritieni utili e i metodi getter/setter per gestire le proprietà (più eventuali metodi come equals(), hashCode(), toString() ....). Punto, solo questo.
    - Una classe Rubrica che modella un "insieme" di contatti. Quindi potrebbe logicamente avere una collezione di oggetti Contatto. Con tutti i metodi sensati per gestire l'insieme (aggiunta, rimozione, ricerche ....). Punto.
    - Una classe IORubrica che ha i metodi per leggere/scrivere da/su file oggetti Rubrica. Punto.

    I nomi delle classi sono a scelta libera, ovviamente, io ho solo fatto un esempio.

    La vedi la separazione dei ruoli??? O no?

    Comunque vista la tua risposta e il tuo approccio iniziale nel codice, potrei dedurre che hai poca familiarità con i concetti della OOP.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9

    Re: Re: Re: Re: Problema Sviluppo Rubrica

    Originariamente inviato da andbin
    Non ho detto che ne puoi fare solo 1!!! Ho detto che siccome la classe ha 2 campi di istanza nome/numero, allora 1 istanza "modella" 1 contatto. Ed è chiaro che puoi creare più istanze, quindi più contatti.

    E questo porta alla questione che dicevo. Se una classe ha già come responsabilità principale quella di modellare una entità .... perché devi fargli fare altro e di tutto e di più??

    Vuoi sapere come sarebbe più logico?
    - Una classe Contatto che modella solo 1 contatto. I campi per i dati, il costruttore/i che ritieni utili e i metodi getter/setter per gestire le proprietà (più eventuali metodi come equals(), hashCode(), toString() ....). Punto, solo questo.
    - Una classe Rubrica che modella un "insieme" di contatti. Quindi potrebbe logicamente avere una collezione di oggetti Contatto. Con tutti i metodi sensati per gestire l'insieme (aggiunta, rimozione, ricerche ....). Punto.
    - Una classe IORubrica che ha i metodi per leggere/scrivere da/su file oggetti Rubrica. Punto.

    I nomi delle classi sono a scelta libera, ovviamente, io ho solo fatto un esempio.

    La vedi la separazione dei ruoli??? O no?

    Comunque vista la tua risposta e il tuo approccio iniziale nel codice, potrei dedurre che hai poca familiarità con i concetti della OOP.
    Ok ci provo grazie

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.