Записать ByteArrayOutputStream в FileOutputStream или записать ByteArray в FileOutputStream?

#java #arrays #file #memory-management #bytearrayoutputstream

#java #массивы #файл #управление памятью #bytearrayoutputstream

Вопрос:

Какой из приведенных ниже подходов более эффективен с точки зрения использования памяти и производительности:

  1. Запись ByteArrayOutputStream в FileOutputStream т.е. baos.writeTo(output); или
  2. Преобразовать ByteArrayOutputStream в ByteArray , а затем записать FileOutputStream , т.е. output.write(baos.toByteArray());

Я проанализировал и обнаружил, что 2-й подход занимает больше памяти при записи в file, поскольку baos.toByteArray() создает вновь выделенный Byte массив.

Пожалуйста, предложите. Как вы думаете, есть ли какая-либо польза от использования output.write(baos.toByteArray()) ?

 FileOutputStream output = new FileOutputStream(path);
ByteArrayOutputStream baos = getBaos(); 
baos.writeTo(output);
//output.write(baos.toByteArray());
  

Комментарии:

1. Ни то, ни другое. Почему у вас есть весь массив байтов или ByteArrayOutputStream в первую очередь? Лучший подход — прочитать исходный код порциями, скажем, 8 КБ, и записать его непосредственно на вывод.

2. Спасибо, @user207421 за быструю обратную связь. Цель состоит в том, чтобы записать poi SXSSFWorkbook в выходной поток, используя ByteArrayOutputStream Я не думаю, что есть способ прочитать рабочую книгу poi по частям и записать ее непосредственно на вывод. Я подумал пропустить промежуточный шаг, чтобы сэкономить немного памяти (запись рабочей книги в ByteArrayOutputStream ) и попытался записать рабочую книгу непосредственно в выходной поток, но это очень медленно. т.е. Рабочая книга. write (os); Пожалуйста, предложите, есть ли у вас лучший способ сделать это. конечная цель — эффективно записать SXSSFWorkbook в FileOutputStream.

Ответ №1:

writeTo напрямую записывает свой внутренний буфер в OUT (т.Е. FileOutputStream), в то время как запись (bao.toByteArray()) занимает больше времени, чем writeTo, поскольку вы правильно проанализировали.