Ответ выводит длину контента?

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

8
задан Cœur 9 July 2019 в 07:02
поделиться

3 ответа

Самый простой способ - это, вероятно, обернуть его в другую реализацию OutputStream , которая пересылает все запросы на запись, но сохраняет внутренний счетчик. Тогда вы просто напишите вместо этого. Не должно быть слишком сложно реализовать - и действительно, он может быть уже.

РЕДАКТИРОВАТЬ: Просто угадав разумное имя ( CountingOutputStream ), мы получили реализацию в Apache Commons IO .

РЕДАКТИРОВАТЬ: Как отмечалось в другом месте, если это для HTTP и ваш клиент еще не выполняет буферизацию полных данных (в этом случае я бы подумал , это может решить проблему длина содержимого), у вас могут возникнуть проблемы из-за необходимости записать длину перед записью данных . В некоторых случаях вы можете обнаружить, что он будет работать до определенного размера (который буферизуется клиентом), а затем потерпит неудачу. В этом случае решения Дэвида будут подходящими.

16
ответ дан 5 December 2019 в 06:23
поделиться

The problem is that you must set the content length in the response header before you start writing any data to the output stream. So your options are:

  1. Write the data to a byte[] array using ByteOutputStream and then copy that to the response output stream once you have the size of the data. However, if you're writing large files, this obviously isn't an option.
  2. Write the data to a temp file and then copy that to the response output once you get the file size. Depending on what you're doing, this may have a performance penalty that is unacceptable.
  3. Depending on how expensive it is to generate the data in the first place, you could generate it once, and throw it away to get the count and then generate it again. Guessing that this is unlikely to be a realistic solution.
  4. Resign yourself to the fact that you won't be able to report the content length in the response header.
8
ответ дан 5 December 2019 в 06:23
поделиться

Вы можете рассмотреть возможность записи в собственный ByteArrayOutputStream и сбросить его в выходной поток ответа в самом конце.

2
ответ дан 5 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: