Как лучше всего использовать ByteBuffer для обработки чередующихся операций чтения / записи в Java? - PullRequest
0 голосов
/ 28 мая 2020

Отредактировано: чтобы сделать вопрос менее «основанным на мнении»

Я хочу попросить подсказанный способ использования байтового буфера в случае чередования чтения / записи.

Мои программные процессы случайная последовательность NIO, которая выполняет операции read() и write() с ByteBuffer. В настоящее время я использую переменную для записи, была ли последняя операция read() или write(), и вызываю flip() или compact() соответственно.

Это лучший подход или ByteBuffer не предназначен для обработки этого задача?


Исходный заголовок вопроса: Java ByteBuffer плохо спроектирован?

Я только начал с Java NIO, и я думаю, что Bytebuffer спроектирован таким образом, чтобы чередование трудно выполнить операции чтения / записи. Если такой шаблон операций и является причиной того, что у нас есть «буфер» в NIO.

В частности, flip() и compact() - ненужные детали для программирования. Если у меня есть случайная последовательность read() и write() для байтового буфера, то у меня нет выбора, кроме как сохранить отдельную переменную, чтобы отслеживать, был ли буфер «перевернут». Например, для перевернутого буфера мне нужно снова compact() перед write, но я не могу этого сделать для неоткрытого буфера.

ИМО, почти нет случаев, когда write() следует за read() не нужно сначала звонить compact() или clear(). Кроме того, нет read() после write() без flip(), поэтому я думаю, что должно быть сделано либо:

  • сделать 'режим чтения' и 'режим записи' явным и выдать предупреждение, если запись в режим чтения или наоборот. Используйте явную команду readMode() или writeMode() для переключения.
  • устраните необходимость переворачивания / сжатия перед чтением / записью, либо приняв другой дизайн (например, кольцевой буфер), либо сделав его неявным в чтении / пишите.

Поскольку я все еще новичок в Java, я хочу знать, является ли моя жалоба le git или при реализации Bytebuffer происходит тщательный выбор дизайна?

1 Ответ

0 голосов
/ 28 мая 2020

Большое спасибо пользователю 207421 за ответ. Он предложил замечательное решение, которое я сейчас использую в своем дизайне.

По сути, вы всегда сохраняете ByteBuffer в одном и том же состоянии после каждой операции.

Например, чтобы сохранить ByteBuffer в развернутом состоянии, то каждая операция write() должна быть заключена в flip() и compact() до и после. Также добавьте синхронизацию для работы с потоками.

...