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

    [Java] - leggere e scrivere in un file di testo

    Sto cercando di imparare qualcosina sulla gestione dei file di testo, ma tra tutte le classi, i metodi e le eccezioni trovate su libri e nel web ho soltanto un gran confusione per la testa.
    Ho visto qualcosina della classe PrintWriter, ma non va bene perchè ogni volta parte da un file vuoto (perdendo i dati precedentemente salvati); ho visto la classe Scanner, comoda per leggere ma non per scrivere; ho visto BufferedReader, ma non permette di scrivere; e infine ho visto la classe RandomAccessFile.
    Finalmente qualcosa che sembra fare al caso mio (suppongo che sia infinitamente lenta rispetto ad altre soluzioni ma non mi importa), questa classe mi permette di leggere e scrivere a mia discrezione... ottimo!
    Peccato che mi stia dando non pochi problemi.
    In pratica questa classe gestisce i file come array di byte con un puntatore che si sposta come una specie di cursore.

    Se mi limito a leggere così non c'è nessun problema:
    codice:
    try {
       while (rafStream.getFilePointer() < rafStream.length() ) {
          System.out.println( rafStream.readLine() );
       }
    }
    catch // ....
    ma se devo prima scrivere sul file per poi leggere ciò che ho scritto cominciano le rogne:
    codice:
    // per scrivere un double sul file
    rafStream.writeDouble(mioDouble); // eseguito ad esempio 10 volte
    
    // per leggere
    while(rafStream.getFilePointer() < rafStream.length() ) {
       System.out.println(rafStream.readDouble() );
    }
    mi legge un unico valore e poi genera un'eccezione.
    Idem se scrivo su file con writeUTF e poi leggo con readUTF e converto in double con parseDouble.

    Che sto sbagliando????
    grazie in anticipo...

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da mastodilu Visualizza il messaggio
    e infine ho visto la classe RandomAccessFile.
    Che sto sbagliando????
    RandomAccessFile va bene solo se il file è "binario", nel senso che contiene dati non testuali, con byte arbitrari. E in più se ti serve l'accesso "casuale".
    Se devi scrivere un file di testo "puro", RandomAccessFile NON va bene. E tanto meno writeUTF, questo non scrive un testo "puro" perché inserisce all'inizio un dato binario riguardante il numero di byte scritti per il String.

    Se vuoi scrivere file di testo "puro", ci sono FileWriter (usa però il charset di default in modo fisso), oppure FileOutputStream (da incapsulare come minimo in OutputStreamWriter, che permette anche di specificare un charset).
    E se vuoi "appendere" invece di sovrascrivere, nota che alcuni costruttori di FileWriter/FileOutputStream hanno il flag "append".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    RandomAccessFile va bene solo se il file è "binario", nel senso che contiene dati non testuali, con byte arbitrari. E in più se ti serve l'accesso "casuale".
    Se devi scrivere un file di testo "puro", RandomAccessFile NON va bene. E tanto meno writeUTF, questo non scrive un testo "puro" perché inserisce all'inizio un dato binario riguardante il numero di byte scritti per il String.

    Se vuoi scrivere file di testo "puro", ci sono FileWriter (usa però il charset di default in modo fisso), oppure FileOutputStream (da incapsulare come minimo in OutputStreamWriter, che permette anche di specificare un charset).
    E se vuoi "appendere" invece di sovrascrivere, nota che alcuni costruttori di FileWriter/FileOutputStream hanno il flag "append".
    ah ecco, grazie

    ma come mai
    codice:
    try {
       while (rafStream.getFilePointer() < rafStream.length() ) {
          System.out.println( rafStream.readLine() );
       }
    }
    catch // ....
    funziona senza alcun problema su un generico file di testo scritto da me?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da mastodilu Visualizza il messaggio
    ma come mai
    codice:
    try {
       while (rafStream.getFilePointer() < rafStream.length() ) {
          System.out.println( rafStream.readLine() );
       }
    }
    catch // ....
    funziona senza alcun problema su un generico file di testo scritto da me?
    Come caso specifico, può funzionare ma solo se il file usa un charset single-byte (es. ASCII o al limite ISO-8859-1). Perché RandomAccessFile non ha alcuna nozione dei charset e il suo readLine legge solo byte e li porta a char mettendo gli 8 bit "alti" del char a 0. Quindi è molto limitato.

    In generale, se vuoi trattare file di testo "puro", per cortesia, ignora RandomAccessFile.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    capito, grazie!

    ma ad esempio per rimpiazzare la riga n del file con una stringa che voglio io, ad esempio acquisita dal programma, devo usare contemporaneamente FileWriter e Scanner (o altre...)?
    Ultima modifica di mastodilu; 28-07-2015 a 13:47

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da mastodilu Visualizza il messaggio
    ma ad esempio per rimpiazzare la riga n del file con una stringa che voglio io
    In generale, non è fattibile. Nel senso che all'interno di un file i byte non si possono fisicamente inserire/eliminare in modo che il resto seguente si "sposti" avanti o indietro. Vale in generale ... non è una questione di Java o non Java.

    Per cambiare righe in mezzo ad un file:
    - si legge tutto il file, si mettono le righe in memoria in una qualche struttura dati (lista, array), poi si modifica tale struttura e infine si riscrive tutto il file.
    oppure
    - se la modifica è fattibile al "volo" riga per riga, si legge una riga per volta, si decide cosa scrivere nella riga e la si appende al fondo di un altro (nuovo) file.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

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.