PDA

View Full Version : [java] utilizzo corretto delle funzioni Reset() e Mark()


federico100mt
08-04-2010, 15:35
:confused:
Vi chiedo un consiglio su come poter impostare il corretto valore del metodo Mark(int val) per effettuare operazioni di skipping e rewinding (come in C per esempio) per la lettura binaria da file.

Il file che vado a leggere presenta differenti tipi nativi di valori, i piu presenti sono i double, gli int e i float.Per esempio, nel caso io voglia iniziare a leggere dal byte numero 40, e poi per esempio se il suo valore fa parte di un certo range, leggerne uno 30 byte sopra, o ritornare addirittura a leggere lo stesso, come devo settare il metodo mark? mi piacerebbe capire meglio come giocare con queste due funzioni. Purtroppo debbo ammettere che dalla documentazione sun non riesco a capirci molto.

nb: ci tengo a specificare che ho gia testato con successo se il buffer supporta queste operazione con il metodo markSupported();

Fede

banryu79
08-04-2010, 16:08
... Per esempio, nel caso io voglia iniziare a leggere dal byte numero 40, e poi per esempio se il suo valore fa parte di un certo range, leggerne uno 30 byte sopra, o ritornare addirittura a leggere lo stesso, come devo settare il metodo mark? mi piacerebbe capire meglio come giocare con queste due funzioni...

Esempio:
[a] Leggo il byte 23 (ora il buffer punta al byte 24).
[b] Il valore del byte letto mi dice che il prossimo byte da leggere č il 40;
[c] Marco la posizione attuale indicando al buffer che deve mantenere valido il mark per i prossimi 17 byte (40-23=17).
buffer.mark(readLimit); // con 'readLimit' che vale 17
[d] Skippo 17-1=16 byte (ora il buffer punta al byte 24+16=40):
buffer.skip(n); // con 'n' che vale 16
[e] Leggo il prossimo byte (ora buffer punta al byte 41);
[f] Eseguo il reset (ora il buffer punta al byte 24).
Sono tornato nella situazione da cui ero partito, al punto [a].

Questo č quello che proverei a fare io, dopo aver letto la documentazione di InputStream.

PGI-Bis
08-04-2010, 16:13
Se puoi usa MappedByteBuffer per la lettura di dati binari da file. E' una specie di DataInput al nandrolone.

banryu79
08-04-2010, 17:14
In questo articolo (http://java.sun.com/developer/technicalArticles/releases/nio/) puoi trovare un esempio e qualche spiegazione su come ottenere un MappedByteBuffer da un FileChannel che a sua volta si ottiene dai classici FileInputStream\FileOutputStream\RandomAccessFile; ne parla proprio nei priim paragrafi.

In pratica PGI-bis ti sta suggerendo di appoggiarti alle funzionalitą fornite dal "New I\O" (che era veramente "new" nella versione 1.4) invece che appogiarti solamente a java.io.