在Java中,哪种可调整大小的循环字节缓冲区是最好的?

20

我需要一个适用于Java单线程的字节缓冲区类。我应该能够在缓冲区的末尾插入数据,并在前端读取数据,其平摊成本为O(1)。当缓冲区满时,它应该调整大小,而不是抛出异常或其他什么。

我可以自己编写一个,但如果标准Java包中不存在此类,则我会感到非常惊讶,如果没有,则我希望它存在于一些经过充分测试的公共库中。

您会推荐什么?


它有一个私有的调整大小方法,您可以轻松地根据动态调整大小的需要进行适应,或者使用“无限”模式,这意味着它将始终增长。 - VonC
5个回答

9
我不确定它是否是“最好的”,但您在这里有一个很好的循环字节缓冲区的示例
这些Java实用程序-OstermillerUtils类受GPL许可证的保护。

此循环字节缓冲区实现了字节的循环缓冲区生产者/消费者模型。使用标准Java InputStreams和OutputStreams进行填充和排空缓冲区。

使用此类是使用PipedInputStream和PipedOutputStream的简单替代方法。
PipedInputStreams和PipedOutputStreams不支持标记操作,不允许您控制它们使用的缓冲区大小,并且具有更复杂的API,需要实例化两个类并将它们连接起来。


这还不错。它不能调整大小,而且它是GPL许可,所以你必须注意许可问题,但这将是一个不错的开始。 - paxdiablo
不错的链接(我也在谷歌上找到了这个),但我不能使用它,我绝对需要它是非阻塞的,因此可调整大小。+1,但没有答案 :-) - Wouter Lievens
它有一个私有的调整大小方法,您可以轻松地根据您的动态调整大小需求进行适应。 - VonC
@ Wouter,它总有一些阻塞点(如果您无法为字节分配更多内存),因此您仍需为此编写代码。 - paxdiablo
有人使用过OstermillerUtils来处理ByteBuffer吗?请提供一些反馈。 - Jus12
显示剩余2条评论

3

它不可调整大小。 - Benjamin Gruenbaum

2
我在一个类似的项目中使用了 java.util.ArrayDeque<Byte>,请注意您可以轻松地改变实现,使用 java.util.concurrent 的 Queue 实现。

9
你可能会发现使用Byte而不是byte会显著降低性能。 ;) - Peter Lawrey
这是一个非常低效的字节缓冲区,不仅因为没有使用原始类型而产生了开销。尝试使用由byte[]支持的东西。 - Martin

1
我写了这样一个类: ByteRingBuffer 它不会自动调整大小,但有一个resize()方法。
它经过一个自动测试程序的“全面测试”,该程序使用随机数来测试所有可能情况。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接