Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    52

    leggere e scrivere tramite RandomAccessFile

    ancora problemi con i file (che non sopporto assolutamente ^^). tramite la classe RandomAccessFile dovrei invertire il contenuto di un file testuale (.txt), però non riesco a capire quali metodi della classe RandomAccessFile devo usare per leggere e scrivere caratteri. avevo pensato al metodo writeChar per scrivere e readChar per leggere, ma quando vado a scrivere, mi cancella tutto e mi scrive solo uno strano simbolo, quando leggo invece mi legge i caratteri come "?". esistono altri metodi per i caratteri? devo fare qualche conversione, e se si come?

    grazie

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

    Re: leggere e scrivere tramite RandomAccessFile

    Originariamente inviato da auron567
    dovrei invertire il contenuto di un file testuale (.txt)
    Innanzitutto dovresti precisare cosa intendi per "ribaltare" .... invertire le righe (prima e ultima, seconda e penultima, ecc..)?? invertire i caratteri in ogni riga(abcd in dcba)? O entrambe? O altro?

    Originariamente inviato da auron567
    però non riesco a capire quali metodi della classe RandomAccessFile devo usare per leggere e scrivere caratteri.
    A dire il vero, RandomAccessFile non è particolarmente appropriata per lavorare "a caratteri" (nonostante abbia metodi che trattano caratteri, che però vanno presi con "le pinze").
    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
    Apr 2008
    Messaggi
    52

    Re: Re: leggere e scrivere tramite RandomAccessFile

    Originariamente inviato da andbin
    Innanzitutto dovresti precisare cosa intendi per "ribaltare" .... invertire le righe (prima e ultima, seconda e penultima, ecc..)?? invertire i caratteri in ogni riga(abcd in dcba)? O entrambe? O altro?

    A dire il vero, RandomAccessFile non è particolarmente appropriata per lavorare "a caratteri" (nonostante abbia metodi che trattano caratteri, che però vanno presi con "le pinze").
    si, scusami se non ho spiegato in modo preciso cosa devo fare: invertire i caratteri di ogni riga (abcd in dcba) e nell'esercizio è richiesto l'ultilizzo di RandomAccessFile. come potrei fare per leggere e scrivere i caratteri? non riesco a trovare un metodo adatto: se scrivo escono fuori strani simboli e anche nel leggere trovo dei problemi.

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

    Re: Re: Re: leggere e scrivere tramite RandomAccessFile

    Originariamente inviato da auron567
    nell'esercizio è richiesto l'ultilizzo di RandomAccessFile.
    Ok. Supponendo che il file sia scritto in un charset "single byte" (altrimenti il discorso non è più valido), tecnicamente si può usare RandomAccessFile per fare quello che chiedi.

    Tenendo però presente che non devi usare readChar() e writeChar()/writeChars(). Perché se leggessi la documentazione vedresti che dice che il carattere viene letto/scritto come 2 byte. E quindi sarebbe corretto l'uso di questi metodi solo se il charset del file fosse UTF-16 in Big Endian. E non è sicuramente il tuo caso ....

    No, dovresti leggere dei byte, in cui presupponi l'equazione 1 byte=1 char. In RandomAccessFile il puntamento del file è 1 solo. Le operazioni di lettura/scrittura fanno "avanzare" il puntamento ovviamente. E lo puoi cambiare con seek().

    Devi fare così: partendo dall'inizio, per ogni riga detto in generale:

    a) Ti salvi il puntamento
    b) Inizi a leggere byte x byte finché non trovi CR o LF (che non devi toccare) e li metti in un array in memoria
    c) Trovato CR o LF inverti il tuo buffer in memoria
    d) Ti salvi il puntamento
    e) Sposti il puntamento preso al punto a)
    f) Scrivi N byte (lo sai a priori quanti!) del buffer che hai già invertito
    g) Salti i CR/LF
    h) Ripeti dal punto a)


    EDIT: puoi anche usare readLine() per leggere la riga, perché tratta 1 byte -> 1 char. E poi usare writeBytes() che anch'esso tratta 1 char -> 1 byte. Ma hai comunque un String che devi invertire.
    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
    Apr 2008
    Messaggi
    52

    Re: Re: Re: Re: leggere e scrivere tramite RandomAccessFile

    Originariamente inviato da andbin
    Ok. Supponendo che il file sia scritto in un charset "single byte" (altrimenti il discorso non è più valido), tecnicamente si può usare RandomAccessFile per fare quello che chiedi.

    Tenendo però presente che non devi usare readChar() e writeChar()/writeChars(). Perché se leggessi la documentazione vedresti che dice che il carattere viene letto/scritto come 2 byte. E quindi sarebbe corretto l'uso di questi metodi solo se il charset del file fosse UTF-16 in Big Endian. E non è sicuramente il tuo caso ....

    No, dovresti leggere dei byte, in cui presupponi l'equazione 1 byte=1 char. In RandomAccessFile il puntamento del file è 1 solo. Le operazioni di lettura/scrittura fanno "avanzare" il puntamento ovviamente. E lo puoi cambiare con seek().

    Devi fare così: partendo dall'inizio, per ogni riga detto in generale:

    a) Ti salvi il puntamento
    b) Inizi a leggere byte x byte finché non trovi CR o LF (che non devi toccare) e li metti in un array in memoria
    c) Trovato CR o LF inverti il tuo buffer in memoria
    d) Ti salvi il puntamento
    e) Sposti il puntamento preso al punto a)
    f) Scrivi N byte (lo sai a priori quanti!) del buffer che hai già invertito
    g) Salti i CR/LF
    h) Ripeti dal punto a)
    ok, penso più o meno di aver capito. solo qualche delucidazione:
    1) per leggere un byte alla volta devo utilizzare il metodo read?
    2) devo creare un array di byte[] che utilizzo diciamo come supporto?
    3) scusami, ma cosa sono CR e LF?

    scusa per le mie lacune su questo argomento e grazie ancora

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

    Re: Re: Re: Re: Re: leggere e scrivere tramite RandomAccessFile

    Originariamente inviato da auron567
    1) per leggere un byte alla volta devo utilizzare il metodo read?
    2) devo creare un array di byte[] che utilizzo diciamo come supporto?
    Se vuoi seguire questa strada (leggi tu i singoli byte), puoi usare read() oppure readByte() oppure readUnsignedByte(). Tutti leggono 1 byte, cambia solo il tipo di ritorno e come indicano la fine del file. Vedi javadoc.
    Altrimenti leggi l'EDIT che ho postato prima.

    Originariamente inviato da auron567
    3) scusami, ma cosa sono CR e LF?
    Carriage return e Line feed, 2 caratteri di controllo ASCII.
    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
    Apr 2008
    Messaggi
    52

    Re: Re: Re: Re: Re: Re: leggere e scrivere tramite RandomAccessFile

    Originariamente inviato da andbin
    Se vuoi seguire questa strada (leggi tu i singoli byte), puoi usare read() oppure readByte() oppure readUnsignedByte(). Tutti leggono 1 byte, cambia solo il tipo di ritorno e come indicano la fine del file. Vedi javadoc.
    Altrimenti leggi l'EDIT che ho postato prima.

    Carriage return e Line feed, 2 caratteri di controllo ASCII.
    ok grazie, provo a vedere cosa riesco a fare e ti faccio sapere.

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    52
    scusate il doppio post, ma andbin volevo dirti che alla fine sono riuscito a completare l'esercizio utilizzando il readLine() e invertendo la stringa. anche se a dire la verità la soluzione è un pò confusionaria, infatti non inverte il file originale, ma ne crea uno nuovo. ero riuscito a realizzarlo anche tramite l'utilizzo del seek e senza array di supporto, solo che funzionava bene solo quando il file era composto da una sola riga. comunque grazie ancora dell'aiuto.

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.