2014-09-18 25 views
6

Ich habe einen oder mehrere ByteBuffers, die Teile einer einzelnen Nachricht enthalten. Jetzt möchte ich diese Nachricht lesen, aber ich möchte N ByteBuffer nicht in einen einzigen kopieren. Mein Parser erwartet einen einzelnen ByteBuffer mit der vollständigen Nachricht, aber meine Nachricht ist in N ByteBuffers unterteilt.Gibt es eine Java ByteBuffer-Implementierung, die mehrere Backing-ByteBuffers unter der Haube kombiniert?

Gibt es eine Möglichkeit, diese N ByteBuffers zu einem einzigen zu kombinieren, ohne Byte zu kopieren? Ich stellte mir eine Art intelligente Implementierung der ByteBuffer-abstrakten Klasse vor, die von diesen ByteBuffer unter der Haube gesichert wird und nur die Zeiger und Delegaten auf den richtigen ByteBuffer einstellt.

Wenn Sie neugierig sind, warum ich das brauche, überprüfen Sie das Protokoll unten von BM & F/Bovespa. Sie zerlegen eine Nachricht in Stücke und sie können in verschiedenen Paketen aus der Reihenfolge kommen, mit anderen Worten, die gleiche Nachrichtensequenz kann in mehreren Paketen kommen, jedes mit einem Nachrichtenstück. Ich kann nicht sequentiell auf den gleichen ByteBuffer schreiben, weil diese Blöcke nicht in der richtigen Reihenfolge sein können. :(

Fehle ich etwas schlauer hier? Es sieht aus wie es keine Möglichkeit gibt sequentiell den gleichen ByteBuffer dieses Chunk Protokoll weiter unten zu schreiben. :(

enter image description here enter image description here

+1

Wenn Sie nicht alle zu einem einzigen Puffer kombinieren möchten, warum erwartet Ihr Parser einen einzelnen ByteBuffer? Klingt wie ein Code-Architektur-Problem. – JLewkovich

+0

@JL Sie könnten Recht haben, aber ich denke nicht. Überprüfen Sie meine Bearbeitung, um das Protokoll, das ich implementieren möchte, einzuschließen. –

+0

Sicher bieten sie eine Java API? Du solltest das alles nicht selbst machen müssen. FIX-APIs für Java sind sicherlich aus anderen Quellen verfügbar. – EJP

Antwort

-2

Sie kann Kette ByteBuffers zueinander, eine ByteBuffer Rückkehr wie folgt:

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

Dieses in einem einzigen ByteBuffer führt, die auf Ihre Parse-Methode übergeben werden kann

0.

Es erstellt effektiv eine Kopie, aber wenn Sie es nicht zuweisen, wird es für GC in die Warteschlange gestellt.

Wenn Sie die Anzahl der ByteBuffers nicht kennen, verwenden Sie eine Liste von ByteBuffers, fügen Sie diese einzeln hinzu und fügen Sie sie dann in eine Schleife ein. Sie können die Liste vor dem Anhängen sortieren, sodass die Chunks in der gewünschten Reihenfolge angezeigt werden.

+0

Ich kann diese Append-Methode nicht auf dem 'ByteBuffer' finden Javadoc. Meinst du die Put-Methode? Selbst wenn es existiert, sieht es so aus, als würde es nur die Bytes in einen neuen ByteBuffer kopieren, nein? Die N ByteBuffer zu nehmen und alle ihre Daten in einen neuen ByteBuffer zu kopieren, ist die triviale und kostengünstige Lösung. Sind Sie einverstanden? –

+0

Übrigens, ich war nicht derjenige, der gewählt hat. –

+0

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

0

Ich denke, dass die Datenstruktur, die Sie suchen, ein Chain Buffer genannt wird. Intern ist es eine dynamisch wachsende Sammlung (z. B. ArrayList in Java) von Byte-Arrays oder Puffern, während sich die Struktur außen wie eine reguläre Buffer verhält.

Es kann ziemlich handlich sein, wenn Sie sich mit der Leistung beschäftigen, obwohl die Implementierung einiger Operationen nicht ganz trivial sein kann (z. B. das Suchen der Position eines gegebenen Musters).

Die einzige öffentliche Java-Implementierung, die ich kenne, ist ChainBuffer in Kraken von NCHOVY (obwohl nicht mehr gepflegt).