Leggere oggetti da un file.bin

di il
4 risposte

Leggere oggetti da un file.bin

Buonasera, ho un problema con la lettura di un file.

Ho una classe "utente.java" che implementa l'interfaccia serializzabile in cui ci sono metodi "get" , "set" e un "main" dove creo 2 oggetti "utente".
Nel main li creo in questo modo:

utente u1 = new utente();
u1.setName("Mario");
u1.setSurname("Rossi");

utente u2 = new utente();
u2.setName("Mario");
u2.setSurname("Bianchi");

Ad esempio il metodo setName è così composto:

public  void setName(String value)
{
	name = value;
}
Dove "name" è stata dichiara all'inizio del file.

In seguito (sempre nel main) scrivo sul file in questo modo:

FileOutputStream fos = new FileOutputStream("/percorso/file/miofile.bin");
ObjectOutputStream oos = new ObjectOutputStream(fos);
		
oos.writeObject(u1);
oos.writeObject(u2);
		
oos.close();

Ora creo un' altra classe java (nello stesso package) con la quale voglio leggere gli oggetti che ho scritto, quindi:
Ho importato il package java.io.*

public class Write
{
	public static void main(String args[]) throws IOException, ClassNotFoundException
	{
		FileInputStream fis = new FileInputStream("/percorso/file/miofile.bin");
		ObjectInputStream ois = new ObjectInputStream(fis);
		utente u;

		while(fis.available() > 0)
		{
			Object r = ois.readObject();
			u = (utente) r;
			System.out.println(u.toString());
		}
		
	}
}
Ma l'output è:


miopackage.utente@30791901
miopackage.utente@6693f61c
Mentre io vorrei una cosa del genere:

Mario Rossi
Mario Bianchi
Oppure un array contenente le stringhe. Avete qualche suggerimento?

Grazie delle eventuali risposte.

4 Risposte

  • Re: Leggere oggetti da un file.bin

    Escher ha scritto:


    Ma l'output è:
    
    
    miopackage.utente@30791901
    miopackage.utente@6693f61c
    
    Mentre io vorrei una cosa del genere:
    
    Mario Rossi
    Mario Bianchi
    
    Questo però non c'entra proprio nulla con la serializzazione.

    Innanzitutto nota che fare

    System.out.println(u.toString());
    oppure
    System.out.println(u);

    Sarebbe la stessa cosa, con entrambi viene invocato toString() sull'oggetto. Solo che nel primo è esplicitato da te, nel secondo il toString() è invocato dentro println.

    Il punto è che la tua classe utente non ridefinisce ("override") il metodo toString().
    Quindi resta solo quello ereditato da Object, che è in grado di fornire solo quella forma che vedi.


    P.S. e potresti anche prendere le singole proprietà e stamparle, senza quindi usare toString.
  • Re: Leggere oggetti da un file.bin

    Grazie mille.
    Questo però non c'entra proprio nulla con la serializzazione.
    Io sinceramente non ho capito molto la serializzazione/deserialiazzazione.
    Serializzazione: Dal web e dal libro la intendono come un procedimento per salvare uno oggetto (o più) in un file in maniera persistente.
    Mentre la deserializzazione è il processo che permette di ricostruire l'oggetto che avevo salvato.

    Ma allora che differenza c'è tra scrivere, ad esempio, una stringa su un file e scrivere una funzione che implementa l'interfaccia serializzabile. In realtà sembra di fare la stessa cosa, solo che con la prima non scrivo "implements Serializable" mentre con la seconda si. Però per entrambe scrivo e leggo dal file, nella stessa maniera.

    Innanzitutto nota che fare

    System.out.println(u.toString());
    oppure
    System.out.println(u);

    Sarebbe la stessa cosa [..]
    Grazie sì hai ragione, ho visto adesso sul libro che System.out.println() vuole una stringa, quindi è la stessa cosa.

    Il punto è che la tua classe utente non ridefinisce ("override") il metodo toString().
    Quindi resta solo quello ereditato da Object, che è in grado di fornire solo quella forma che vedi.
    Ho implementato due funzioni: getName() e getSurname(). Ora restituisce rispettivamente i nomi e i cognomi dei due oggetti salvati.

    Ad esempio, l'output di questo:
    
    
    while(fis.available() > 0)
    		{
    			Object r = ois.readObject();
    			u = (Clients) r;
    			System.out.println(u.getName());
    		}
    
    è:
    
    Mario
    Paolo
    
    Per stampare solo le informazioni di uno dei due oggetti, ho fatto una cosa del genere:
    
    String s = "Mario";
    		
    		while(fis.available() > 0)
    		{
    			Object r = ois.readObject();
    			u = (Clients) r;
    			if(u.getName().equals(s))
    			{
    				System.out.println(u.getName());
    				System.out.println(u.getSurname());
    				
    			}
    			
    		}
    
    
    Il fatto è che se ha molte proprietà diventa una cosa molto lunga da scrivere, magari sarebbe comodo costruirsi un array e fare un for.

    Ho un'altra domanda (scusa te ne sto facendo milioni): Se volessi modificare il nome di uno dei due oggetti, ad esempio non si chiama più Mario ma Gabriele, basterà solo invocare la funzione setName("Gabriele") ? Così facendo , però, nel file, rimarrà Mario , ma tutte le volte che richiamerò getName() mi ritornerà Gabriele. Dopo aver ricompilato la classe java che scrive sul file i due oggetti e successivamente richiamando getName() , esso ritornerà di nuovo Mario. E' corretto?

    Grazie ancora e scusami le tante domande.
  • Re: Leggere oggetti da un file.bin

    Escher ha scritto:


    Io sinceramente non ho capito molto la serializzazione/deserialiazzazione.
    Serializzazione: Dal web e dal libro la intendono come un procedimento per salvare uno oggetto (o più) in un file in maniera persistente.
    Mentre la deserializzazione è il processo che permette di ricostruire l'oggetto che avevo salvato.
    La serializzazione è un processo generale e specifico della piattaforma Java. Utilizza un protocollo "binario" per lo stream di dati che viene salvato.

    Escher ha scritto:


    Ma allora che differenza c'è tra scrivere, ad esempio, una stringa su un file e scrivere una funzione che implementa l'interfaccia serializzabile.
    Se scrivi gli oggetti utente su un file testuale, il formato è "tuo", te lo inventi tu come vuoi. E quindi solo tu sapresti come rileggere il file per ricreare correttamente degli oggetti utente. Mentre invece la serializzazione ha il suo protocollo ben preciso che è standard della piattaforma Java.

    Escher ha scritto:


    Grazie sì hai ragione, ho visto adesso sul libro che System.out.println() vuole una stringa, quindi è la stessa cosa.
    Di println ce ne sono ben 10 in overload. Ci sono quelli per i tipi primitivi, c'è il println(String) e c'è il println(Object). Quest'ultimo, non potendo fare nulla di specifico sull'oggetto, ci invoca appunto toString() per stampare una descrizione dell'oggetto, qualunque essa sia.

    Escher ha scritto:


    Il fatto è che se ha molte proprietà diventa una cosa molto lunga da scrivere, magari sarebbe comodo costruirsi un array e fare un for.
    Il toString() esiste proprio per fornire una "descrizione" dell'oggetto.

    Escher ha scritto:


    Se volessi modificare il nome di uno dei due oggetti, ad esempio non si chiama più Mario ma Gabriele, basterà solo invocare la funzione setName("Gabriele") ?

    Escher ha scritto:


    Così facendo , però, nel file, rimarrà Mario
    Sì, ovvio, finché non riscrivi il file.
  • Re: Leggere oggetti da un file.bin

    Grazie davvero, mi stai aiutando molto a comprendere Java!
Devi accedere o registrarti per scrivere nel forum
4 risposte