Каков наилучший размерный буфер циклического байта, доступный в Java?
Мне нужен класс байтового буфера в Java для однопоточного использования. Я должен иметь возможность вставлять данные в глубину буфера и читать данные спереди, с амортизированной стоимостью O (1). Буфер должен изменить размер, когда он заполнен, а не выбрасывать исключение или что-то еще.
Я мог бы написать один сам, но я был бы очень удивлен, если бы этого еще не было в стандартном пакете Java, и если это не так, я бы ожидал, что он будет существовать в какой-то проверенной публичной библиотеке.
Что вы порекомендовали бы?
Ответы
Ответ 1
Не уверен, что это "лучший", но у вас есть хороший пример Циркулярный буфер байта здесь.
Те классы Java Utilities - OstermillerUtils находятся под Лицензия GPL.
Этот циркулярный байт-буфер реализует модель байтов-производителей/потребителей циклического буфера. Заполнение и освобождение буфера осуществляется стандартными Java InputStreams и OutputStreams.
Использование этого класса является более простой альтернативой использованию PipedInputStream и PipedOutputStream.
PipedInputStreams и PipedOutputStreams не поддерживают операцию маркировки, не позволяют вам управлять размерами буферов, которые они используют, и имеют более сложный API, требующий создания двух классов и связывания их.
Ответ 2
Интересно, хорошо ли это работает
https://svn.apache.org/repos/asf/etch/releases/release-1.0.0/util/src/main/java/etch/util/CircularByteBuffer.java
Мы, вероятно, попробуем это, так как это лицензия Apache.
Ответ 3
Я использую java.util.ArrayDeque<Byte>
в проекте с аналогичными требованиями. Обратите внимание, что вы можете легко изменить реализацию, используя java.util.concurrent Queue
реализация.
Ответ 4
Я написал такой класс:
ByteRingBuffer
Он не изменяет размер автоматически, но существует метод resize().
Он "хорошо протестирован" с автоматической тестовой программой, которая использует случайные числа для проверки всех возможных ситуаций.
Ответ 5
Другим решением является использование GrowablePipedOutputStream и GrowablePipedInputStream от JBoss.