是否有一个Java ByteBuffer实现在幕后结合了多个支持ByteBuffer?

2022-04-08 00:00:00 real-time java nio bytebuffer

我有一个或多个包含单个消息部分的ByteBuffer。现在我想阅读此消息,但我不想将N字节缓冲区复制到单个字节缓冲区中。我的解析器需要一个包含完整消息的ByteBuffer,但我的消息被分成N个ByteBuffer。

有没有一种方法可以在不复制字节的情况下将这N个字节缓冲区合并为一个单独的缓冲区?我想象着ByteBuffer抽象类的某种智能实现,它由这些ByteBuffer幕后支持,只需将指针和委托调整到正确的ByteBuffer即可。

如果您对我为什么需要这样做感到好奇,请查看BM&;F/Bovespa提供的以下协议。它们将消息分成块,它们可能会在不同的包中打乱顺序,换句话说,相同的消息序列可能会出现在多个包中,每个包都有一个消息块。我不能按顺序写入相同的ByteBuffer,因为这些块可能会乱序。:(

我是不是错过了一些更聪明的东西?在给定下面的块协议的情况下,看起来没有办法顺序地写入相同的字节缓冲区。:(


解决方案

我认为您正在寻找的数据结构称为链缓冲区。在内部,它是一个动态增长的字节数组或缓冲区的集合(例如,在Java中为ArrayList),而在外部,该结构的行为类似于常规的Buffer

如果您处理性能问题,它可能会非常方便,尽管某些操作的实现可能不是完全琐碎的(例如,搜索给定模式的位置)。

我所知道的唯一公共Java实现是ChainBufferinKrakenby NCHOVY(尽管不再维护)。

相关文章