Когда использовать байтовый массив, а когда использовать поток? - PullRequest
8 голосов
/ 17 января 2012

Мне нужно отправить изображения и небольшие видеофайлы (около 5 МБ, менее 10 МБ) в службу REST, которую я напишу. Мне интересно, должен ли я использовать Byte [] или Stream для выполнения этой задачи. Какова будет разделительная линия с точки зрения размера файла передачи между использованием Byte [] и Stream?

Ответы [ 3 ]

12 голосов
/ 17 января 2012

Объем свободной памяти, которую вы готовы выделить для транзакции, является вашим единственным реальным ограничением.

Если у вас есть файл 5M, вам необходимо загрузить все это в ОЗУ,Это будет стоить 5 млн.

. Если вы выполняете потоковую передачу, вы можете использовать гораздо меньше памяти, читая небольшие фрагменты из файла в повторно используемый буфер и записывая эти фрагменты в поток HTTP.

7 голосов
/ 17 января 2012

В конечном счете, вы собираетесь отправлять поток в любом случае.

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

Если вы принимаете ее как поток, нет смысла превращать ее в массивный byte[] просточтобы его толкнули в другой поток.Используйте буфер размером 4 или 8 КБ (4 или 8, а не 4–8, поскольку в совпадениях по целому числу страниц памяти есть некоторые незначительные преимущества по сравнению с теми, которыми вы также можете воспользоваться).

Если вы создаете его самостоятельно, в большинстве случаев поток является как более простым (перенос в двоичном или текстовом редакторе и работает через него), так и более эффективным.

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

2 голосов
/ 22 ноября 2017

Общий тест при выборе между байтовым массивом или потоком зависит от того, знаете ли вы заранее, сколько байтов содержится в данных, и достаточно ли мало это число для данной цели.

Например, если вы имеете дело с небольшим файлом значков (менее 50 КБ), доступным на локальном компьютере, и вы знаете размер файла, используйте массив байтов.

И наоборот, если вы работаете с файлом фильма, в котором было бы трудно, не говоря уже о том, что нужно хранить 2 ГБ контента в памяти одновременно, используйте поток.

Потоки лучше всего подходят для обработки больших наборов данных или данных, длина которых неизвестна заранее.

...