2013-10-09 3 views
3

Я использую массив байтов с методом write() OutputStream для хранения данных в файл. Для этого я запускаю массив байтов с предопределенным размером. Но я не хочу, чтобы он занимал столько места для каждого InputStream, размер которого мог быть намного меньше размера массива. Возможно ли каким-то образом сделать массив динамическим, чтобы он регулировал его размер в зависимости от размера InputStream? у меня есть что-то вроде этого в моем коде:Могу ли я увеличить размер массива байтов?

byte[] b = new byte[20000]; 
int length;     
while ((length = in.read(b))!= -1) { 
    //writing it to a file 
    op.write(b, 0, length); 
    k++; 
} 

in.close(); 
op.close(); 

Здесь in является InputStream объекта и op является FileOutputStream объекта. Я пытался использовать ArrayLists, но нет прямого метода FileOutputStream для записи данных в ArrayList, он принимает только byte[].

+0

Почему не 'байт [] байт = новый байт [1024];' –

+0

Я просто использовал это в качестве манекена размер. Фактически, я использую его для сохранения изображений из Интернета. Таким образом, 1024 сделал бы. Но тем не менее, большинство изображений составляет 1024. Я не хочу этого лишнего пространства. Если он может каким-то образом динамически настроить свой размер, это будет здорово. – syntheticlaugh

+0

Да, это работает. См. Код, который я опубликовал, и я могу загрузить файлы> 200 МБ без каких-либо проблем с этим небольшим буфером. –

ответ

2

Проблема не на выходной стороны вообще - это просто, что вы не знаете, как большой вход есть.

Непонятно, откуда приходит InputStream - если вход принят по сети, например, вы можете не иметь никаких указаний на размер заранее. InputStream сам не имеет простого способа проверить, имеет ли поток известную длину.

Имейте в виду, что массив 20K здесь только важно, когда вы копируете данные. После этого можно собрать мусор. Есть ли у вас какие-либо признаки того, что это действительно проблема?

Вы можете просто уменьшить размер массива до (скажем) 4K или 8K. Вы все равно сможете обрабатывать любой размер ввода, поскольку вы зацикливаете на нем и копируете его в куски. Это просто не будет довольно как эффективный в тех случаях, когда вы можете прочитать больше, чем этот размер буфера за один раз. Степень этой разницы в эффективности будет очень контекстно-зависимой - только вы можете определить, будет ли этот код работать в вашей реальной ситуации - или насколько важна эта производительность с точки зрения времени или насколько полезно сохранять несколько тысяч байт которые могут быть собраны сразу же после мусора.

+0

Это выше код работает с небольшим буфером 'byte [] bytes = new byte [1024] //'? Правильно ?? Я что-то упускаю? –

+0

@ sᴜʀᴇsʜᴀᴛᴛᴀ: Да, поэтому я предложил сократить его до 4 или 8K. 1K будет явно работать тоже ... это просто еще один произвольный размер. Стоимость в эффективности, с большим количеством чтений и записей. Если вы предлагаете 1K лучше, чем 4K, почему вместо 256 байтов? Не сравнивая конкретную ситуацию, мы не можем точно знать, какова будет разница в эффективности. –

+0

Да, Джон, я также предлагаю немного меньшего размера, вот и все. Понял. –

0

Не имеет значения, какой размер буфер находится с точки зрения кода. Фиксированный размер 8192 достаточен для большинства целей, независимо от длины файла. Ваш код будет работать с любым размером больше нуля.

0

Просто возьмите небольшое количество буфера. Оно работает.

Длинная спина споткнулась с такой ситуацией, и нижняя часть кода работает отлично для меня.

byte[] b = new byte[1024]; //a little buffer 
      int length;     
      while ((length = in.read(b))!= -1) { 
       //writing it to a file 
       op.write(b, 0, length); 
       k++; 
      } 

      in.close(); 
      op.close(); 

Спросил и получили разъяснения здесь долго назад: How the buffer byte array is continuously filling while streaming?

Смежные вопросы