Когда использовать байтовый массив и когда байтовый буфер? - PullRequest
56 голосов
/ 06 марта 2011

В чем разница между байтовым массивом и байтовым буфером?
Кроме того, в каких ситуациях один должен быть предпочтительнее другого?

[мой вариант использования предназначен для Интернетаприложение разрабатывается в Java].

Ответы [ 3 ]

42 голосов
/ 17 августа 2015

Существует несколько способов работы с байтами.И я согласен, что не всегда легко выбрать лучший:

  • byte[]
  • java.nio.ByteBuffer
  • java.io.ByteArrayOutputStream (в комбинациис другими потоками)
  • java.util.BitSet

byte[] - это просто примитивный массив, просто содержащий необработанные данные.Таким образом, у него нет удобных методов для создания или управления контентом.

A ByteBuffer больше похож на компоновщик. Он создает byte[].В отличие от массивов, он имеет более удобные вспомогательные методы.(например, метод append(byte)).Это не так просто с точки зрения использования . (Большинство уроков слишком сложны или некачественны, но этот один куда-то вас приведет. Сделайте еще один шаг? Затем прочитайте о многих подводных камнях .)

Вы можете испытать искушение сказать, что ByteBuffer делает с byte[], что StringBuilder делает с String.Но есть определенная разница / недостаток класса ByteBuffer.Как и в случае с массивами, ByteBuffer имеет фиксированный размер. Итак, когда вы создаете его экземпляр, вы уже должны указать размер буфера.

Это одна из причин, по которой Я часто предпочитаю использовать ByteArrayOutputStream, потому что он автоматически изменяет размеры, , как ArrayList.(У него есть метод toByteArray()).Иногда это практично, чтобы обернуть его в DataOutputStream. Преимущество заключается в том, что у вас будут дополнительные удобные вызовы (например, writeShort(int), если вам нужно записать 2 байта).*BitSet пригодится, когда вы хотите выполнить операции на уровне битов. Вы можете получить / установить отдельные биты, и он имеет методы логического оператора, такие как xor().(Метод toByteArray() был введен только в Java 7).

Конечно, в зависимости от ваших потребностей, вы можете объединить их все для создания byte[].

23 голосов
/ 06 марта 2011

ByteBuffer является частью нового пакета ввода-вывода (nio), который был разработан для быстрой передачи данных на основе файлов.В частности, Apache - это очень быстрый веб-сервер (написанный на C), поскольку он считывает байты с диска и помещает их в сеть напрямую, не перетасовывая их через различные буферы.Это осуществляется с помощью отображаемых в память файлов, которых в ранних версиях Java не было.С появлением nio стало возможным создавать веб-сервер на Java, который работает так же быстро, как Apache.Если вам нужна очень быстрая пропускная способность между файлами и сетью, вам нужно использовать файлы с отображением в памяти и ByteBuffer.

Базы данных обычно используют файлы с отображением в памяти, но этот тип использования редко эффективен в Java.В C / C ++ можно загрузить большой кусок памяти и преобразовать его в нужные вам типизированные данные.Из-за модели безопасности Java это обычно неосуществимо, потому что вы можете конвертировать только в определенные нативные типы, и эти преобразования не очень эффективны.ByteBuffer работает лучше всего, когда вы просто имеете дело с байтами как обычными байтовыми данными - как только вам нужно преобразовать их в объекты, другие классы java io обычно работают лучше и их проще использовать.

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

3 голосов
/ 06 марта 2011
...