Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    42

    Scrivere su file di testo

    Ciao a tutti!Ho un problema che non riesco a risolvere con le classi FileReader e PrintWriter,le quali consentono di scrivere su un file di testo.
    Vi posto un metodo che aggiunge delle persone in una rubrica:
    codice:
    //Metodo che aggiunge un elemento (vincolo:ogni nominativo deve essere diverso da tutti gli altri)
    	public void aggiungi(String nome,String telefono,String fax){
    		boolean presente = false;
    		for (Persona contatto : contatti){
    			if (nome.equals(contatto.getNome())){
    				System.out.println("Il nome " + nome + " è già presente nella lista");
    				presente = true;
    				
    			}
    		}
    		if (presente == false){
    		Persona contatto = new Persona(nome,telefono,fax);
    		contatti.add(contatto);
    		}
    	}
    Bene!Io ora voglio implementare questo metodo,in modo tale che scriva su un file di testo tutto ciò che produce,e se riaccede al file per una seconda,terza..ecc volta,non loi sovrascrive ma accoda la scrittura di altri dati.

    Io ho provato a fare un file di test di questo tipo:
    codice:
    import java.io.*;
    import java.util.Scanner;
    public class File {
    public static void main (String[]args) throws FileNotFoundException {
    	PrintWriter scrittore = new PrintWriter("/home/lord/Desktop/ciccio.txt");
    	Rubrica rubb = new Rubrica();
    	rubb.aggiungi("ciccio", "123", "234");  //nome telefono fax
    	scrittore.print(rubb);
    	scrittore.close();
    Bene.Il file lo scrive,ma mi scrive questa roba qui:Rubrica@e48e1b

    Come posso risolvere questo problema?

    Spero possiate aiutarmi grazie in anticipo!

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

    Re: Scrivere su file di testo

    Originariamente inviato da onepiece007
    scrittore.print(rubb);
    Il metodo print() riceve un oggetto e l'unica cosa che fa è invocare il toString() sull'oggetto per ottenere la stringa da stampare. Da ciò che dici, risulta che nella classe Rubrica non hai implementato toString(), poiché quel testo particolare che hai riportato è ciò di norma fornisce il toString() di Object.

    Ma in ogni caso il concetto è sbagliato. Non devi cercare di ottenere da Rubrica una stringona da scrivere su file. Devi stabilire prima di tutto un formato dei dati ben preciso e quindi iterare sulla rubrica e scrivere ogni "record" Persona nel modo che hai stabilito tu.

    Un formato semplice potrebbe essere questo:

    Mario;01123545;0116724
    Giacomo;02452;02567

    Cioè nome, telefono e fax su una singola riga, separati da un ';'. Questo è solo uno dei possibili formati.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    42
    Andbin grazie per l'aiuto.
    Però non ho ben capito una cosa.
    Il file di prova in questo caso potrebbe essere teoricamento corretto?
    Quindi devo editare il metodo della classe RUbrica vero?Se è cosi come faccio a separare con ; i tre campi del record?Perchè alla fine del metodo questa invocazione
    contatti.add(contatto);
    ,aggiunge tutti e 3 i campi dell'oggetto chiamato "contatto".
    Quindi per separarli col ; intendi separare in 3 passaggi questa operazione?
    Però ciò non è possibile perchè se faccio tipo:
    contatti.add(contatto.getNome());
    ,eclipse mi restituisce giustamente errore!

    Come fare allora?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da onepiece007
    Però non ho ben capito una cosa.
    Il file di prova in questo caso potrebbe essere teoricamento corretto?
    Quindi devo editare il metodo della classe RUbrica vero?Se è cosi come faccio a separare con ; i tre campi del record?
    No, devi fare un metodo apposito (non necessariamente in Rubrica) che apre il file, fa una iterazione sugli elementi in Rubrica e per ogni elemento Persona ne prende i singoli campi e li scrive sul file con un certo formato. Poi chiude il file.

    Originariamente inviato da onepiece007
    contatti.add(contatto.getNome());

    eclipse mi restituisce giustamente errore!
    Se contatti è un ArrayList<Persona> è chiaro che add() può solo aggiungere un oggetto Persona, non certo un String.
    E non ho capito cosa vuoi fare: perché vorresti aggiungere solo un nome in una collezione di oggetti Persona???
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    42
    Originariamente inviato da andbin
    No, devi fare un metodo apposito (non necessariamente in Rubrica) che apre il file, fa una iterazione sugli elementi in Rubrica e per ogni elemento Persona ne prende i singoli campi e li scrive sul file con un certo formato. Poi chiude il file.

    Se contatti è un ArrayList<Persona> è chiaro che add() può solo aggiungere un oggetto Persona, non certo un String.
    E non ho capito cosa vuoi fare: perché vorresti aggiungere solo un nome in una collezione di oggetti Persona???
    Non è che volevo aggiungere solo un nome facendo contatti.add(contatto.getNome());
    Perchè dopo avrei fatto tipo contatti.add(contatto.getTelefono()); e contatti.add(contatto.getFax()); iterando.
    IL problema rimangono i singoli campi,ed è proprio qui che eclipse mi da l'errore!
    Comunque ora implemento questo metodo,seguo i tuoi passi e ti faccio sapere!

    Grazie di nuovo!

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da onepiece007
    Non è che volevo aggiungere solo un nome facendo contatti.add(contatto.getNome());
    Perchè dopo avrei fatto tipo contatti.add(contatto.getTelefono()); e contatti.add(contatto.getFax());
    Ma no, non devi pensare di fare le cose in questo modo! Qui si tratta di questioni concettuali legate alla programmazione ad oggetti.

    Hai una classe Persona che rappresenta un nome/telefono/fax. Vuoi fare una collezione di persone, quindi puoi usare ad esempio un ArrayList<Persona>.
    Quando vuoi aggiungere una persona nella collezione, dovrai prima creare un oggetto Persona (passando i dati nel suo costruttore) e quindi aggiungere l'oggetto Persona nella collezione.

    Se poi hai una classe Rubrica che contiene l'ArrayList<Persona>, potresti anche creare in Rubrica più metodi in overload, es:

    codice:
    public void aggiungi (Persona p) {
        contatti.add (p);
    }
    
    public void aggiungi (String nome, String telefono, String fax) {
        contatti.add (new Persona (nome, telefono, fax));
    }
    Ma solo appunto per una questione di comodità. Il concetto però non cambia, se fai una collezione di oggetti Persona, essa contiene solo oggetti Persona.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    42
    EDIT:ho postato contemporaneamente senza saperlo!

    Il mistero si infittisce!Porca miseria è l'ultimissimo passaggio per concludere il compito!
    Ho provato a fare un metodo all'infuori della classe Rubrica.java,però non riesco a fare a meno del metodo main che non dovrei usare,altrimenti poi non mi riesco a racapezzare con il vero file di test.Il problema ora sono le eccezioni,che nel nostro cdl NON abbiamo trattato e il prof. ci ha detto esplicitamente di NON usare.
    Perciò nel file Rubrica.java ho aggiunto questo metodo,ma anch'esso mi da problemi di eccezioni!
    codice:
    	//Metodo che SCRIVE  su file
    	public void scriveFile(){
    		FileWriter file = new FileWriter("/home/lord/Desktop/prova.txt"); //<<<Errore di IOException
    		PrintWriter scrittore = new PrintWriter(file);
    		for (Persona contatto : contatti){
    			scrittore.println(contatto);  //Non da errore ma potrebbe funzionare?
    		}
    	}
    }

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da onepiece007
    scrittore.println(contatto); //Non da errore ma potrebbe funzionare?
    Se nella classe Persona hai fatto l'override di toString() in modo da far restituire una stringa con i dati dell'oggetto in un formato che sia ovviamente poi comodo da leggere ed interpretare in una successiva fase di lettura del file, sì allora può funzionare.

    Per le eccezioni non so che dirti, nel senso che quando si lavora con i file le eccezioni che derivano da IOException vanno tenute in considerazione, perché sono "checked".

    Ad ogni modo, è sempre il solito problema: si cercano di fare delle cose più o meno complicate ma senza avere le "basi" necessarie.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    42
    Originariamente inviato da andbin
    Se nella classe Persona hai fatto l'override di toString() in modo da far restituire una stringa con i dati dell'oggetto in un formato che sia ovviamente poi comodo da leggere ed interpretare in una successiva fase di lettura del file, sì allora può funzionare.

    Per le eccezioni non so che dirti, nel senso che quando si lavora con i file le eccezioni che derivano da IOException vanno tenute in considerazione, perché sono "checked".

    Ad ogni modo, è sempre il solito problema: si cercano di fare delle cose più o meno complicate ma senza avere le "basi" necessarie.
    Si Andbin hai ragione!Effettivamente quest'ultimo passaggio il prof lo poteva risparmiare,dato che ci ha spiegato in pochissimo tempo come scrivere "ciao ciccio" su un file,e questo non mi sembra poi tanto sufficiente per il compito che ci ha dato.
    Ad esempio tu mi hai detto di fare l'override di toString,cosa che non sappiamo fare(ma che farò ora per conto mio).
    Comunque ti ringrazio per la pazienza!

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.