Я пишу в выходной поток различными способами. Как я могу, прежде чем закрыть его, узнать длину содержимого выходного потока?
Длина содержимого выходного потока ответа?
Ответы (3)
Самый простой способ, вероятно, состоит в том, чтобы обернуть его в другую реализацию OutputStream
, которая перенаправляет все запросы на запись, но сохраняет внутренний счетчик. Тогда вы просто пишете об этом вместо этого. Не должно быть слишком сложно реализовать - и действительно, он уже может быть.
РЕДАКТИРОВАТЬ: Простое угадывание разумного имени (CountingOutputStream
) привело к реализации в Apache Commons IO.
РЕДАКТИРОВАТЬ: Как отмечалось в другом месте, если это для HTTP, и ваш клиент еще не выполняет буферизацию полных данных (в этом случае я бы подумал, что это может определить длину содержимого), вы могут возникнуть проблемы из-за необходимости записи длины перед записью данных. В некоторых случаях вы можете обнаружить, что он будет работать до определенного размера (который буферизирует клиент), а затем выйдет из строя. В таком случае решения Дэвида будут уместны.
Проблема в том, что вы должны установить длину содержимого в заголовке ответа, прежде чем начнете записывать какие-либо данные в выходной поток. Итак, ваши варианты:
- Запишите данные в массив byte[] с помощью ByteOutputStream, а затем скопируйте их в выходной поток ответа, когда у вас будет размер данных. Однако, если вы пишете большие файлы, это явно не вариант.
- Запишите данные во временный файл, а затем скопируйте их в вывод ответа, как только вы получите размер файла. В зависимости от того, что вы делаете, это может привести к неприемлемому снижению производительности.
- В зависимости от того, насколько дорого обходится генерация данных, вы можете сгенерировать их один раз, выбросить, чтобы получить подсчет, а затем сгенерировать снова. Предполагая, что это вряд ли будет реалистичным решением.
- Смиритесь с тем, что вы не сможете сообщить длину контента в заголовке ответа.
Вы можете рассмотреть возможность записи в свой собственный ByteArrayOutputStream и сбросить его в поток вывода ответа в самом конце.