#java #arrays #file #memory-management #bytearrayoutputstream
#java #массивы #файл #управление памятью #bytearrayoutputstream
Вопрос:
Какой из приведенных ниже подходов более эффективен с точки зрения использования памяти и производительности:
- Запись
ByteArrayOutputStream
вFileOutputStream
т.е.baos.writeTo(output);
или - Преобразовать
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, поскольку вы правильно проанализировали.