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

    Aprire un file in Java per la lettura

    Buonasera a tutti, sono in difficoltà con l'apertura di un file di testo in un piccolo programma java: il mio codice è il seguente
    codice:
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    
    public class CaricaFile {
        
        public String leggiFile() throws IOException{
            
            File f = new File("Vocabolario.txt");
            FileReader fread = new FileReader(f);
            BufferedReader bread = new BufferedReader(fread);
            String letturaFile;
            while((letturaFile = bread.readLine()) != null){
                return bread.readLine();
            } 
            bread.close();
            return letturaFile;
                }
    }
    Ora, semplicemente, se al posto di "!=" nel while metto "==" stampa la prima riga del file, altrimenti la seconda. Non riesco a capire perchè, molto probabilmente sbaglio l'algoritmo per l'apertura del file. Sapreste spiegarmi il perchè succede questo, o al limite sapreste fornirmi un algoritmo semplice per l'apertura di un file e per il salvataggio del contenuto in una stringa/vettore di stringhe/arrayList?
    Grazie e tanti Auguri!

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    1,453
    Se letturaFile lo setti nel while con bread.readLine() non ha senso rileggerlo
    codice:
    while((letturaFile = bread.readLine()) != null){
         //adesso usa letturaFile come vuoi sapendo che è una nuova linea, esempio con ArrayList<String>
         linee.add(letturaFile);
     } 
    
    Ultima modifica di RoTeam; 22-12-2014 a 20:06

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quel codice ha poco senso ed è concettualmente sbagliato.
    Tutto il problema nasce dall'istruzione return inserita dentro al while, che provoca questi due effetti:

    1) Viene restituita sempre e soltanto la prima riga del file, o null se il file è vuoto. Tutte le eventuali altre righe presenti nel file verranno bellamente ignorate. Se questo è il comportamento voluto, non ha alcun senso mettere il while e la cosa va gestita in modo diverso.

    2) Nel caso il file contenga almeno una riga, non viene chiuso. E questo è un gravissimo errore.


    Spiega esattamente cosa ti aspetti da quel codice, così da cercare di sistemarlo, perchè così com'è, ripeto, è sbagliato.


    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
    Io vorrei semplicemente leggere il file, per poi fargli un po' di parsing ed estrarre le informazioni che mi interessano.

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    4 mesi dopo...
    La risposta che hai dato è decisamente poco chiara.
    Cosa vuoi ottenere? Una stringa unica con tutto il contenuto del file? Un vettore/lista/array di stringhe (dove ogni stringa rappresenta ciascuna riga del file)? Un array di byte con il conteuto di ciascun byte del file? Altro ancora (tipo, se ciascuna riga del file rappresenta una qualche entità, magari vuoi una lista di queste entità)? Come vedi "leggere un file" non significa assolutamente nulla... bisogna specificare COSA si vuole ottenere da questa lettura.

    Anche "fare un po' di parsin", per noi che non sappiamo nulla della tua applicazione, non vuol dire proprio niente.

    Sii più preciso.

    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
    Allora, innanzitutto mi scuso per il ritardo nella mia risposta. Nel dettaglio io ho un file, nello specifico "vocabolario.txt" contenente una serie di righe corrispondenti a vocaboli (ciascuna riga corrisponde ad un vocabolo). A fianco del vocabolo, separato da esso da un carattere di spazio, si trova la corrispondente traduzione dello stesso. Ad esempio:
    "casa house"
    Ecco io vorrei leggere il file, per poi separare vocaboli in italiano dalla corrispondente traduzione: per la separazione sono a posto, più che altro è la lettura del file, e il salvataggio dei vocaboli in due ArrayList. Spero di essere stato sufficientemente esaustivo.
    Grazie

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da luca93abc Visualizza il messaggio
    il salvataggio dei vocaboli in due ArrayList.
    Sicuro che ti servono davvero 2 ArrayList distinti? Diventa poi difficile la gestione ....

    La traduzione deve poter avvenire solo in un senso? O in entrambi? Hai valutato una mappa dove la chiave è una parola e il valore è la traduzione? (se deve essere bidirezionale, ne dovrai avere 2 di mappe).
    Ma soprattutto, hai pensato magari a incapsulare tutta questa struttura dati in una apposita classe es. Dizionario? Il leggiFile() potrebbe appunto restituire un Dizionario. E Dizionario potrebbe offrire i metodi per la traduzione.
    Qui si tratta di questioni di "design" delle classi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Sì, è già molto più chiaro.
    Se quello che vuoi ottenere, quindi, sono due ArrayList<String> contenenti ciascuno i vocaboli in italiano e i vocaboli in inglese, è possibile farlo tranquillamente. Quello che ti voglio chiedere, prima di proseguire, è se non ti sia più utile, al posto di dye ArrayList slegati, avere una mappa: Map<String,String> dove ogni chiave (rappresentata dal vocabolo in italiano) trova il suo corrispondente valore (vocabolo in inglese).

    Una mappa è molto più utile nei casi dei dizionari.

    In entrambi i casi si tratta, comunque, di scorrere il file in lettura (con un ciclo while) e, per ciascuna riga letta, fare la divisione (lo split), ottenere, quindi i due valori (parola italiana e parola inglese) e farne quel che vuoi (mettere ciascuna in un ArrayList o buttare la coppia <chiave, valore> nella mappa).


    codice:
    // Scorro tutto il file, riga per riga
    while((letturaFile = bread.readLine()) != null) {
       String[] vocaboli = letturaFile.split(" ");   // spezzo la stringa in due
    
       // vocaboli[0] contiene la parola italiana
       // vocaboli[1] contiene la parola inglese
       ...   // Fai quel che vuoi
    }

    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

  9. #9
    Sì effettivamente anche una mappa potrebbe andare bene al mio fine. Che non riesco a ben capire comunque è la "banale" lettura del file...

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da luca93abc Visualizza il messaggio
    Che non riesco a ben capire comunque è la "banale" lettura del file...
    Il pezzo di codice abbozzato da LeleFT nel post #8 è esattamente quanto serve.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava 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 © 2025 vBulletin Solutions, Inc. All rights reserved.