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