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:
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.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
Come potrei fare in maniera più furba?