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

17

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

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

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

    
задан Wouter Lievens 28.11.2008 в 13:00
источник
  • Он имеет частный метод изменения размера, который вы можете легко адаптировать к потребностям динамического изменения размера или к «бесконечному» режиму, что означает, что он всегда будет расти. –  VonC 28.11.2008 в 13:13

5 ответов

8

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

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

  

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

     

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

    
ответ дан VonC 28.11.2008 в 13:07
  • Это неплохо. Это не изменяет размер, и это GPL, поэтому вам нужно следить за вопросами лицензирования, но это было бы хорошим началом. –  paxdiablo 28.11.2008 в 13:10
  • Хорошая ссылка (я тоже нашел это в google), но я не могу ее использовать, мне абсолютно необходимо, чтобы она была неблокирующей, поэтому изменяемой по размеру. +1, но не ответил :-) –  Wouter Lievens 28.11.2008 в 13:11
  • Он имеет частный метод изменения размера, который можно легко адаптировать к потребностям динамического изменения размера. –  VonC 28.11.2008 в 13:12
  • @Wouter, он всегда будет блокировать в какой-то момент (если вы не можете выделить больше памяти для байтов), так что вам все равно придется это кодировать. –  paxdiablo 28.11.2008 в 13:13
  • @Pax: вы имеете в виду, когда у вас не хватает памяти? Эта линия мышления пойдет на любой изменчивый контейнер. Или я не понимаю? –  Wouter Lievens 28.11.2008 в 13:15
Показать остальные комментарии
3

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

Ссылка

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

    
ответ дан Dean Hiller 09.04.2013 в 18:13
  • Не изменяется –  Benjamin Gruenbaum 20.07.2017 в 23:01
2

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

    
ответ дан dfa 25.05.2009 в 19:50
  • Вы можете обнаружить, что использование байта вместо байта является значительным ударом. ;) –  Peter Lawrey 14.10.2009 в 09:26
  • Это очень неэффективный байтовый буфер не только потому, что накладные расходы не используются при использовании примитивов. Вместо этого попробуйте что-то, поддерживаемое байтом []. –  Martin 31.05.2017 в 13:44
1

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

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

Он «проверен» с помощью автоматической тестовой программы, которая использует случайные числа для проверки всех возможных ситуаций.

    
ответ дан Christian d'Heureuse 03.04.2014 в 22:41
0

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

ответ дан Mohsen 13.10.2009 в 22:11