Каков наилучший циклический байтовый буфер с изменяемыми размерами, доступный в Java? - PullRequest
20 голосов
/ 28 ноября 2008

Мне нужен класс байтового буфера в Java для однопоточного использования. Я должен быть в состоянии вставить данные в конец буфера и прочитать данные в передней части, с амортизированной стоимостью O (1). Размер буфера должен изменяться при заполнении, а не генерировать исключение или что-то в этом роде.

Я мог бы написать один сам, но я был бы очень удивлен, если бы его еще не было в стандартном пакете Java, и если бы его не было, я бы ожидал, что он существует в какой-то хорошо протестированной публичной библиотеке .

Что бы вы порекомендовали?

Ответы [ 5 ]

9 голосов
/ 28 ноября 2008

Не уверен, что это «лучший», но у вас есть хороший пример Буфер кольцевого байта здесь .

Те Java Utilities - OstermillerUtils классы находятся под лицензией GPL .

Этот кольцевой буфер байтов реализует модель производителя / потребителя кольцевого буфера для байтов. Заполнение и очистка буфера выполняется стандартными Java InputStreams и OutputStreams.

Использование этого класса является более простой альтернативой использованию PipedInputStream и PipedOutputStream.
PipedInputStreams и PipedOutputStreams не поддерживают операцию пометки, не позволяют вам управлять размерами буфера, которые они используют, и имеют более сложный API, который требует создания двух классов и их соединения.

3 голосов
/ 09 апреля 2013

Интересно, хорошо ли работает этот

https://svn.apache.org/repos/asf/etch/releases/release-1.0.0/util/src/main/java/etch/util/CircularByteBuffer.java

Мы, вероятно, попробуем это, поскольку это лицензия apache.

2 голосов
/ 25 мая 2009

Я использую java.util.ArrayDeque<Byte> в проекте с аналогичными требованиями. Обратите внимание, что вы можете легко изменить реализацию, используя java.util.concurrent Queue осуществление.

1 голос
/ 04 апреля 2014

Я написал такой класс: ByteRingBuffer

Размер не изменяется автоматически, но есть метод resize ().

Это "хорошо проверено" с автоматической программой тестирования, которая использует случайные числа для проверки всех возможных ситуаций.

0 голосов
/ 14 октября 2009

Другое решение заключается в использовании GrowablePipedOutputStream и GrowablePipedInputStream от JBoss.

...