В чем разница между байтовым массивом и байтовым буфером?
Кроме того, в каких ситуациях следует отдать предпочтение другому?
[my usecase предназначен для разработки веб-приложения в java].
В чем разница между байтовым массивом и байтовым буфером?
Кроме того, в каких ситуациях следует отдать предпочтение другому?
[my usecase предназначен для разработки веб-приложения в java].
Есть несколько способов работы с байтами. И я согласен, что не всегда легко выбрать лучший
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[]
.
ByteBuffer является частью нового пакета IO (nio), который был разработан для быстрой пропускной способности файловых данных. В частности, Apache - очень быстрый веб-сервер (написанный на C), потому что он считывает байты с диска и напрямую помещает их в сеть, не перетасовывая их через различные буферы. Он делает это через файлы с отображением памяти, которые ранние версии Java не имели. С появлением nio стало возможным писать веб-сервер в Java, который так же быстро, как Apache. Если вам нужна очень быстрая пропускная способность от файла к сети, вы хотите использовать файлы с отображением памяти и ByteBuffer.
Базы данных обычно используют файлы с отображением памяти, но этот тип использования редко работает на Java. В C/С++ можно загрузить большой кусок памяти и направить его на типизированные данные, которые вы хотите. Из-за модели безопасности Java это, как правило, невозможно, потому что вы можете преобразовать только некоторые родные типы, и эти преобразования не очень эффективны. ByteBuffer работает лучше всего, когда вы просто используете байты как простые байтовые данные - как только вам нужно преобразовать их в объекты, другие классы java io обычно работают лучше и проще в использовании.
Если вы не имеете дело с файлами с отображением памяти, вам действительно не нужно беспокоиться с ByteBuffer - вы обычно используете массивы байтов. Если вы пытаетесь создать веб-сервер с максимально возможной пропускной способностью исходных байт-данных на основе файлов, тогда ваш лучший друг будет ByteBuffer (в частности, MappedByteBuffer).
Эти две статьи могут помочь вам http://nadeausoftware.com/articles/2008/02/java_tip_how_read_files_quickly и http://evanjones.ca/software/java-bytebuffers.html