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

    Leggere un file di testo una riga alla volta

    Buongiorno a tutti! Molto probabilmente la risposta alla mia domanda è scontata, ma qui io ci sto perdendo la mattina... Devo leggere un file una riga alla volta, stando fuori dalla funzione main. Ho provato in diversi modi ma ottengo sempre due letture della prima riga (penso per il principio che una chiamata ad un metodo da oggetti differenti con gli stessi parametri da risultati uguali). Il mio codice è questo:
    codice:
    public class GestioneFile implements IFilePartite {    private String path;
    
    
        public void setPath(String path) {
            this.path = path;
        }
    
    
        public String leggi() throws IOException{
            BufferedReader br = new BufferedReader(new FileReader(new File(path)));
            String thisLine = br.readLine();
            StringBuffer sb = new StringBuffer();
            sb.append(thisLine);
            return sb.toString();
        }
    }
    Poi da una classe di test ho il seguente codice:
    codice:
    public class TestLettura01 {    
        public static void main(String[] args) throws IOException {
            GestioneFile gf = new GestioneFile();
            gf.setPath(IFilePartite.pathCalcio);
            System.out.println(gf.leggi());
            GestioneFile gf1 = new GestioneFile();
            gf1.setPath(IFilePartite.pathCalcio);
            System.out.println(gf1.leggi());
    
    
        }
    }
    Il fine di tutto ciò sarebbe un'interfaccia grafica che ad ogni click mi da in output una riga del mio file di testo, ma come potete vedere sono ancora in alto mare. Mi sapreste aiutare?

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Java ha una sezione apposita del forum.

    Sposto.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Con quel tuo codice stai creando 2 istanze della classe GestioneFile.
    Ciascuna avrà il suo stato (che non è condiviso con le altre per il principio di incapsulamento).
    Di conseguenza, passando a ciascuna istanza la stringa del percorso, ciascuna istanza andrà a creare un BufferedReader diverso, e ciascuno di questi BufferedReader sarà posizionato all'inizio del file. Quindi, la chiamata al metodo leggi() non farà altro che prendere la riga "attualmente puntata", leggerla e portare avanti il puntatore.
    Essendo due istanze diverse, con ciascuno un proprio stato, ciascuna sarà posizionata all'inizio del file, quindi ciascuna produrrà solo la prima riga del file.

    Se vuoi che ad ogni chiamata venga letta una nuova riga dal file, allora crea UNA sola istanza della classe GestioneFile e solo su quella chiameri più volte il metodo leggi().


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da luca93abc Visualizza il messaggio
    Devo leggere un file una riga alla volta, stando fuori dalla funzione main. Ho provato in diversi modi ma ottengo sempre due letture della prima riga
    Semplicemente perché riapri il file (quindi ricrei FileReader/BufferedReader) ad ogni invocazione di leggi(). Visto che hai creato una classe apposita (GestioneFile) che incapsula questa logica, ti basta tenere come "stato" dell'oggetto il BufferedReader.
    E più invocazioni di leggi() sullo stesso oggetto GestioneFile useranno lo stesso BufferedReader.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Semplicemente perché riapri il file (quindi ricrei FileReader/BufferedReader) ad ogni invocazione di leggi().

    Azz, avevo visto il metodo leggi() e il metodo setPath() "al contrario". Avevo visto una sola riga di codice e davo per scontato che fosse un banale br.readLine(), quindi l'avevo associato al metodo leggi... c'è poco da fare: ultimamente leggo troppo velocemente.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Quindi dovrei creare un oggetto solo e su di esso chiamare più volte leggi()?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da luca93abc Visualizza il messaggio
    Quindi dovrei creare un oggetto solo e su di esso chiamare più volte leggi()?
    Si ma devi anche fare in modo che l'oggetto GestioneFile mantenga il BufferedReader.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  8. #8
    Quindi lo devo mettere nel costruttore?

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da luca93abc Visualizza il messaggio
    Quindi lo devo mettere nel costruttore?
    La costruzione del BufferedReader sì ma poi devi anche tenerlo come variabile di istanza .. non certo locale al costruttore!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

Tag per questa discussione

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 © 2024 vBulletin Solutions, Inc. All rights reserved.