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

    [java] leggere un file

    Ciao a tutti! Dal titolo sembrerebbe che io voglia fare un cosa banale, della serie basta usare gli stream di read e write per i file, ma non è proprio così. Vi descrivo il problema:


    Per una tesina di un corso all'università devo pensare e implementare degli algoritmi di compressione su testo (in particolare run-length encoding e huffman in successione), e valutare i risultati che ottengo in termini di velocità e rapporto di compressione.

    Fare run-length encoding ricercando stringhe di caratteri però non è una cosa furba, in quanto difficilmente troverò pattern di caratteri ripetuti più di due volte all'interno di un testo qualsiasi, quindi la soluzione più ingegnosa sembra essere quella di farlo sui bit, e poi pensare alla costruzione dell'albero di huffman di conseguenza.
    A questo pundo mi trovo quindi a dover aprire un file testuale leggendo anzichè i caratteri i codici ascii a loro corrispondenti, in modo da poter fare un'analisi sulla stringona di bit e comprimere di conseguenza.
    Per avere i codici ascii uso un metodo che mi sembra un po' macchinoso:
    codice:
    FileInputStream myFile=new FileInputStream(args[0]);
    int iterazioni=myFile.available();
    int pippo;
    String bits="";
    for(int i=0;i<iterazioni;i++){
     pippo=(int) myFile.read();
     bits+=Integer.toBinaryString(pippo);
    }
    System.out.println(bits); //Poi al posto di questa stampa ci metterò la mia funzione di compressione
    ed anche poco furbo, nel senso che con un file di testo normale ci metto un tempo ragionevole, ma con la divina commedia non finisco mai.
    Come potrei fare in maniera più furba?
    max

    Silence is better than bullshit.
    @mmarcon
    jHERE, Maps made easy

  2. #2
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    innanzitutto on dovresti leggere l'intero file in una stringa, tanto meno fare operazioni del tipo:

    bits+=Integer.toBinaryString(pippo);

    quell'operazione causa la creazione di una nuova stringa a partire dalle due che concateni e la ripeti per ogni byte del file letto...quindi molto costosa!

    Se devi tenere l'intero file in memoria come sequenza di bit memorizzalo in un'array di caratteri ad esempio, o di interi, o di byte. Poi utilizza uno strem bufferizzato attaccato al file stream. Inoltre puoi leggere l'intero file direttamente nell'array con una sola chiamata:

    public int read(byte[] b)


    Il modo più veloce per fare la conversione in binario è di tenere un array di conversione di 256 elementi, tale che il primo elemento corrisponde alla stringa '00000000', il secndo a '00000001' e cosi via fino a ricoprire l'intero intervallo 0-255. quindi per ogni byte letto dal file, se vale x, leggi la stringa che si trova in posizione x nell'array di conversione e aggiungi nelle prossime 8 posizioni dell'array che rappresenta il file i suoi caratteri. In questo modo il file sara rappresentato da un array di dimensione pari a 8*(dimensione del file in byte).

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  3. #3
    ok, poniamo che io abbia letto il file nell'array, e adesso mi trovo una cosa del tipo:
    codice:
    b[0]=1100000
    b[1]=0011100
    b[2]=0111100
    
    e così via.
    Mettendo insieme i primi tre valori nell'array avrei
    110000000111000111100, che secondo la mia funzione di compressione dovranno diventare qualcosa del tipo 2,1 7,0 3,1 3,0 4,1 2,0 ovviamente poi il tutto dovrà essere ricodificato e riscritto in forma binaria nel file attraverso un qualche stream di output. In questa situazione una volta ottenuto l'array di byte come mi comporto?
    max

    Silence is better than bullshit.
    @mmarcon
    jHERE, Maps made easy

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.