В чем разница между ArrayBuffer и Blob?
Я читаю http://www.html5rocks.com/en/tutorials/file/xhr2/ и пытается выяснить разницу между ArrayBuffer и Blob.
Разве оба контейнера не состоят из битов? Следовательно, оба контейнера не могли быть просмотрены многими способами (как 32-битные куски, 16-битные куски и т.д.)?
Ответы
Ответ 1
Это объясняется на странице.
ArrayBuffer
ArrayBuffer представляет собой общий контейнер фиксированной длины для двоичных данных. Они очень удобны, если вам нужен обобщенный буфер необработанных данных, , но реальная сила, стоящая за этими ребятами, заключается в том, что вы можете создавать "представления" базовых данных с использованием массивов с набором символов. Фактически, несколько представлений могут быть созданы из одного источника ArrayBuffer. Например, вы можете создать 8-разрядный целочисленный массив, который имеет тот же массив ArrayBuffer, что и существующий 32-разрядный целочисленный массив из одних и тех же данных. Основные данные остаются неизменными, мы просто создаем разные представления.
BLOB
Если вы хотите работать непосредственно с Blob и/или не нужно манипулировать ни одним из байтов файла, используйте xhr.responseType = 'blob':
Ответ 2
Резюме
Если вам не нужна возможность писать/редактировать (используя ArrayBuffer
), то формат Blob
, вероятно, будет лучшим.
Деталь
Я пришел к этому вопросу со другой страницы html5rocks. и обнаружил, что @Bart van Heukelom комментарии полезны, поэтому я хотел поднять их до ответа здесь.
Я также нашел полезным найти ресурсы, специфичные для объектов ArrayBuffer
и Blob
. Я добавил акцент, чтобы повторить полезную деталь, которую я искал. Итак, несмотря на то, что Blob
делает акцент на "необработанных данных", он очень работоспособен.
Некоторые другие моменты на ArrayBuffer
против Blob
:
- переменчивость
- ArrayBuffer можно изменить (например, с помощью DataView)
- BLOB-объект неизменен
- Источник
- Цитирую Барта ван Хейкелом:
- ArrayBuffer находится в памяти, доступен для манипуляций.
- Большой двоичный объект может находиться на диске, в кэш-памяти и других местах , недоступных
-
Уровень доступа
- ArrayBuffer потребуется некоторый слой доступа, например, типизированные массивы
- BLOB-объекты могут быть переданы непосредственно в другие функции, такие как
window.URL.createObjectURL
, как показано в примере из OP URL.
- Однако, как указывает Мёрре, вам все равно могут понадобиться API-интерфейсы, связанные с файлами, такие как
FileReader
, для работы с BLOB-объектами.
- Перерабатывать
- Использование в других библиотеках
jsZip
; (new JSZip()).loadAsync(...)
принимает как ArrayBuffer
, так и Blob
: String/Array of bytes/ArrayBuffer/Uint8Array/Buffer/Blob/Promise
Вот подробности документации, которые мне помогли:
Вот ArrayBuffer
Объект ArrayBuffer используется для представления универсальной фиксированной длины Буфер необработанных двоичных данных. Вы не можете напрямую манипулировать содержимым ArrayBuffer; вместо этого вы создаете один из объектов типизированного массива или объект DataView, который представляет буфер в определенном формате, и используйте это для чтения и записи содержимого буфера.
Вот Blob
Объект Blob представляет файловый объект из неизменяемого, необработанных данных. BLOB-объекты представляют данные, которые не обязательно являются родными для JavaScript формат. Файловый интерфейс основан на Blob, наследующем BLOB функциональность и расширение его для поддержки файлов в пользовательской системе.