Когда использовать байтовый массив и буфер байта?

318
37

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


[my usecase предназначен для разработки веб-приложения в java].

спросил(а) 2021-01-25T22:26:06+03:00 4 месяца, 4 недели назад
1
Решение
277

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

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

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

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

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

Это одна из причин, почему я часто предпочитаю использовать ByteArrayOutputStream потому что он автоматически изменяет размеры, как это делает ArrayList. (У него есть toByteArray()). Иногда это практично, чтобы обернуть это в DataOutputStream. Преимущество состоит в том, что у вас будут дополнительные удобные вызовы (например, writeShort(int) если вам нужно записать 2 байта).

BitSet пригодится, когда вы хотите выполнять операции на уровне битов. Вы можете получить/установить отдельные биты, и он имеет методы логического оператора, такие как xor(). (Метод toByteArray() был представлен только в Java 7.)

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

ответил(а) 2021-01-25T22:26:06+03:00 4 месяца, 4 недели назад
215

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


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

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

ответил(а) 2021-01-25T22:26:06+03:00 4 месяца, 4 недели назад
88
ответил(а) 2021-01-25T22:26:06+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема