Autore Topic: File e ricerca binaria  (Letto 578 volte)

Offline roccia80

  • Utente junior
  • **
  • Post: 89
  • Respect: 0
    • Mostra profilo
File e ricerca binaria
« il: 15 Ottobre 2010, 20:42:40 CEST »
0
Buonasera ragazzi!

Sono nuovo del forum e, in generale, della programmazione per Android. Parto semplicemente con poche conoscenze di Java.

Mi piacerebbe realizzare (per conto terzi) una applicazione in grado di leggere documenti di testo classificati in indici ad albero. La struttura ad albero dell'indice viene gestita tramite dati presenti in un db sqlite e non ho avuto problemi a realizzarla.
I "guai" sono iniziati per reperire identificativi e testo dei documenti che si trovano invece memorizzati su file binari (il materiale è fornito da terzi, non posso modificarlo). I file contengono moltissimi dati e possono assumere peso in KB e MB notevole.
Gestivo il file nel seguente modo:
Codice (Java): [Seleziona]
 
        InputStream is = getResources().openRawResource(R.raw.file1);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int numRead = 0;
       
        try {
            while((numRead = is.read(buffer))!=-1){
                baos.write(buffer, 0, numRead);
            }
        }
......
        byte[] bytes = baos.toByteArray();
        long value = 0;
        for (int offset=0; offset<bytes.length; offset = offset+4) {
                value = arr2long(bytes,offset);
        }
con
Codice (Java): [Seleziona]
        public static long arr2long (byte[] arr, int start) {
                int i = 0;
                int len = 4;
                int cnt = 0;
                byte[] tmp = new byte[len];
                for (i = start; i < (start + len); i++) {
                        tmp[cnt] = arr[i];
                        cnt++;
                }
                long accum = 0;
                i = 0;
                for ( int shiftBy = 0; shiftBy < 32; shiftBy += 8 ) {
                        accum |= ( (long)( tmp[i] & 0xff ) ) << shiftBy;
                        i++;
                }
                return accum;
        }
Per ricavare gli effettivi valori degli identificativi dei documenti.
Amici con esperienza di programmazione su ipod e iphone mi hanno consigliato però di lasciar perdere in quanto metodo inutile e insostenibile.
Mi hanno consigliato di adottare una ricerca binaria direttamente sul file.
Ma come faccio? Non posso più collocare i file nella cartella raw?
Mi sapete dare dei consigli?

Grazie
Ciao
« Ultima modifica: 15 Ottobre 2010, 20:45:22 CEST da roccia80 »

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:File e ricerca binaria
« Risposta #1 il: 15 Ottobre 2010, 20:49:55 CEST »
0
Non ho capito un paio di cose... anzi, diciamo che non ho capito nulla!  :D

Cosa intendi con:
  • documenti di testo classificati in indici ad albero
  • identificativi e testo dei documenti

Offline roccia80

  • Utente junior
  • **
  • Post: 89
  • Respect: 0
    • Mostra profilo
Re:File e ricerca binaria
« Risposta #2 il: 15 Ottobre 2010, 20:59:59 CEST »
0
Non ho capito un paio di cose... anzi, diciamo che non ho capito nulla!  :D

Cosa intendi con:
  • documenti di testo classificati in indici ad albero
  • identificativi e testo dei documenti

La struttura ad indice ad albero è intesa come:
Titolo I
    Sezione I
    Sezione II
Titolo II
    Sezione I
       Capitolo I
    Sezione II
Ma questa è gestita con db e son riuscito a riprodurla, no problem.
Cliccando su Capitolo I, dovrei mostrare una lista di documenti (doc 1, doc 2) identificati da un id che si trova sul file binario e che mi rimanda ad un altro file binario contenente il suo testo. Il problema sta nel fatto di come reperire tale id: apro tutto il file e lavoro su vettore di byte, oppure lavoro sul file stesso con ricerca binaria? Oppure ci sono altre soluzioni?
Grazie