我有一个或多个包含单个邮件部分的ByteBuffers。现在我想阅读此消息,但我不想将N ByteBuffer复制到单个消息中。我的解析器需要一个带有完整消息的ByteBuffer,但我的消息被分成N个ByteBuffers。
有没有办法将这些N个ByteBuffers组合成一个没有字节复制的单个?我想象了ByteBuffer抽象类的某种智能实现,它由底层的ByteBuffer备份,只需调整指针并委托给正确的ByteBuffer。
如果您对我需要的原因感到好奇,请查看下面的BM& F / Bovespa协议。它们将消息分成块,并且它们可以在不同的数据包中无序出现,换句话说,相同的消息序列可以包含多个数据包,每个数据包都有一个消息块。我不能按顺序写入相同的ByteBuffer,因为这些块可能出现故障。 :(
我在这里错过了一些更聪明的东西吗?在下面给出了这个块协议,看起来没有办法顺序写入相同的ByteBuffer。 :(
答案 0 :(得分:0)
我认为您正在寻找的数据结构(据我所知)称为链缓冲区。在内部,它是字节数组或缓冲区中动态增长的集合(例如,Java中的ArrayList
),而在外部,结构的行为类似于常规Buffer
。
如果你处理性能会很方便,虽然某些操作的实现可能不是完全无关紧要的(例如搜索给定模式的位置)。
我知道的唯一公共Java实现是ChainBuffer
{/ 3}} NCHOVY(虽然不再维护)。
答案 1 :(得分:-2)
您可以将ByteBuffers链接到彼此,返回ByteBuffer,如下所示:
bba.append(bbb.toBytes()).append(bbc.toBytes())
这会产生一个ByteBuffer,可以传递给你的解析方法。
它有效地创建了一个副本,但除非你将它分配给某个东西,否则它将排队等候GC。
如果您不知道ByteBuffers的计数,请使用ByteBuffers列表,并在运行中添加每个,然后将它们附加到循环中。您可以在追加之前对列表进行排序,以便按照您想要的顺序显示块。