2014-09-18 29 views
6

Ho uno o più ByteBuffer contenenti parti di un singolo messaggio. Ora voglio leggere questo messaggio ma non voglio copiare N ByteBuffer in uno solo. Il mio parser si aspetta un singolo ByteBuffer con il messaggio completo, ma il mio messaggio è diviso in N ByteBuffers.Esiste un'implementazione Java ByteBuffer che combina più supporti ByteBuffers sotto il cofano?

C'è un modo per combinare questi N ByteBuffers in uno solo senza copiare byte? Ho immaginato una sorta di implementazione intelligente della classe astratta ByteBuffer che è stata sottoposta a backup da questi ByteBuffer e basta regolare i puntatori e delegare al ByteBuffer corretto.

Nel caso si sia curiosi di sapere perché ne ho bisogno, controllare il protocollo di seguito da BM & F/Bovespa. Rompono un messaggio in blocchi e possono venire fuori ordine in pacchetti diversi, in altre parole, la stessa sequenza di messaggi può arrivare in più pacchetti, ognuno con un blocco di messaggi. Non riesco a scrivere in sequenza sullo stesso ByteBuffer perché questi blocchi possono essere fuori uso. :(

mi sto perdendo qualcosa più intelligente qui? Sembra che non v'è alcun modo di scrivere in sequenza sullo stesso ByteBuffer dato questo protocollo pezzo di sotto. :(

enter image description here enter image description here

+1

Se non si desidera combinare tutti in un singolo buffer, perché il parser si aspetta un ByteBuffer singolo? Sembra un problema di architettura del codice. – JLewkovich

+0

@ JL Potresti avere ragione, ma io non la penso così. Controlla la mia modifica per includere il protocollo che sto tentando di implementare. –

+0

Sicuramente forniscono un'API Java? Non dovresti fare tutto da solo. Le API FIX per Java sono certamente disponibili da altre fonti. – EJP

risposta

-2

potete ByteBuffers catena gli uni agli altri, restituendo un ByteBuffer come segue:

bba.append(bbb.toBytes()).append(bbc.toBytes()) 

Questo si traduce in un unico ByteBuffer, che può essere passata al metodo parse

0.

Viene effettivamente creata una copia, ma a meno che non la si assegni a qualcosa, verrà accodata per GC.

Se non si conosce il conteggio di ByteBuffer, utilizzare un elenco di ByteBuffer e aggiungerne uno al volo, quindi aggiungerli in un ciclo. È possibile ordinare l'elenco prima di aggiungerlo in modo che i blocchi vengano visualizzati nell'ordine desiderato.

+0

Non riesco a trovare questo metodo append sul 'ByteBuffer' javadoc. Intendi il metodo put? Anche se esiste, sembra che copi solo i byte in un nuovo ByteBuffer, no? Prendere gli N ByteBuffer e copiare tutti i loro dati in un nuovo ByteBuffer è la soluzione banale e costosa. Sei d'accordo? –

+0

Btw, non ero quello che ha votato. –

+0

http://download.oracle.com/otn_hosted_doc/jdeveloper/1012/jdev-doc/oracle/ide/util/ByteBuffer.html – CharlieS

0

Penso che la struttura dati che si sta cercando sia chiamata (a mia conoscenza) a Chain Buffer. Internamente si tratta di una raccolta in crescita dinamica (ad esempio ArrayList in Java) di matrici di byte o buffer, mentre all'esterno la struttura si comporta come un normale Buffer.

Può essere molto utile se si ha a che fare con le prestazioni, anche se l'implementazione di alcune operazioni potrebbe non essere completamente banale (ad esempio cercare la posizione di un determinato modello).

L'unica implementazione pubblica Java di cui sono a conoscenza è ChainBuffer in Kraken da parte di NCHOVY (anche se non viene più mantenuta).