2009-11-18 1 views

ответ

16

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

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

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

+0

U, Apache Commons! Я должен начать забывать об Apache Commons !!! Я попробую. – Trick

+0

Он работает :) – Trick

+0

Будет ли он работать с большими данными? Вы должны установить заголовок «Content-length», прежде чем записывать что-либо в outputStream ответа, точно так же, как Дэвид отметил –

2

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

+5

Это будет, однако, очень опасным для памяти, поскольку каждый байт байта [] ест один байт памяти JVM. – BalusC

8

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

  1. Запишите данные в массив byte [] с использованием ByteOutputStream, а затем скопируйте их в выходной поток ответа после того, как вы будете иметь размер данных. Однако, если вы пишете большие файлы, это, очевидно, не вариант.
  2. Запишите данные в файл temp и затем скопируйте их в ответ, как только вы получите размер файла. В зависимости от того, что вы делаете, это может привести к снижению производительности, что неприемлемо.
  3. В зависимости от того, насколько дорогим является генерация данных в первую очередь, вы можете сгенерировать его один раз и выбросить, чтобы получить счет, а затем сгенерировать его снова. Предполагая, что это вряд ли будет реалистичным решением.
  4. Откажитесь от факта, что вы не сможете сообщить длину содержимого в заголовке ответа.