Структура данных для записи/чтения байтов

Я продолжаю сталкиваться со случаем, когда мне нужна какая-то структура, скажем, размера буфера 4096, и я могу

  1. записать байты в
  2. читать байты из него
  3. сбросить чтение обратно к предыдущему чтению
  4. САМОЕ ВАЖНОЕ, не нужно иметь дело с копированием, так как окна данных приближаются к концу массива байтов !!! (Это очень похоже на круговой буфер, в основном с обертыванием или чем-то еще)

ByteBuffer кажется такой же сердечной болью, как byte[], когда вы пишете в него и читаете из него на обоих из них, начало массива начинает пустеть. Я почти просто хочу структуру списка или что-то в этом роде... Я просто хочу, чтобы все это управлялось для меня (или мне, возможно, придется написать свою собственную структуру). Я думаю, что какой-то тип InputStream был бы хорош с пометкой и сбросом, чтобы я мог пометить, прежде чем читать, а затем сбросить, если в буфере пока недостаточно данных.

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


person Dean Hiller    schedule 09.04.2013    source источник
comment
ByteBuffer кажется совершенно правильным для этого, и ByteBuffer.compact() действительно то, что вы хотите использовать, когда хотите переместить оставшийся буфер обратно в начало.   -  person Louis Wasserman    schedule 09.04.2013
comment
производительность является ноздря в ноздрю, фактически пропустив 1 ГБ через обе реализации. compact действительно выигрывает с небольшим отрывом в нашем случае использования. спасибо ... Я бы отметил это как правильный ответ, если бы это был ответ;).   -  person Dean Hiller    schedule 10.04.2013


Ответы (3)


ByteBuffer кажется совершенно правильным для этого, и ByteBuffer.compact() действительно то, что вы хотите использовать, когда хотите переместить оставшийся буфер обратно в начало.

person Louis Wasserman    schedule 10.04.2013

Возможно, вы сможете использовать этот циклический байтовый буфер — используйте метод getAvailable() вместо чтения и затем сброс.

person Zim-Zam O'Pootertoot    schedule 09.04.2013
comment
ick, GPL, apache подойдет - person Dean Hiller; 09.04.2013

хм, я только что нашел эту лицензию без GPL... лицензия Apache выглядит так...

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

кто-нибудь использует это? lloks хорошо для меня.

person Dean Hiller    schedule 09.04.2013