2009-11-18 10 views

Respuesta

16

La manera más fácil es probablemente envolverlo en otra implementación OutputStream que reenvía todas las solicitudes de escritura, pero mantiene un contador interno. Entonces solo debes escribir eso. No debería ser demasiado difícil de implementar, y de hecho ya puede haber uno.

EDITAR: Simplemente adivinar un nombre razonable (CountingOutputStream) se le ocurrió una implementación en Apache Commons IO.

EDITAR: Si esto es para HTTP y su cliente no está ya haciendo un almacenamiento en búfer de los datos completos (en cuyo caso habría pensado que es podría calcular la longitud del contenido), es posible que tiene problemas debido a la necesidad de escribir la longitud antes de escribir los datos. En algunos casos, puede encontrar que funcionará hasta cierto tamaño (que el cliente almacena en búfer) y luego falla. En ese caso, las soluciones de David serán apropiadas.

+0

U, Apache Commons! ¡Tengo que empezar a no olvidarme de Apache Commons! Intentaré. – Trick

+0

Está funcionando :) – Trick

+0

¿Funcionaría en datos de gran tamaño? Debe establecer el encabezado "Content-length" antes de escribir cualquier cosa en outputStream de la respuesta, tal como David notó –

2

Puede considerar escribir en su propio ByteArrayOutputStream y vaciarlo al flujo de salida de respuesta al final.

+5

Sin embargo, quedará muy ocupado de memoria ya que cada byte de un byte [] consume un byte de la memoria de JVM. – BalusC

8

El problema es que debe establecer la longitud del contenido en el encabezado de respuesta antes de comenzar a escribir datos en la secuencia de salida. Sus opciones son:

  1. Escriba los datos en una matriz de bytes [] utilizando ByteOutputStream y luego cópielos en la secuencia de salida de respuesta una vez que tenga el tamaño de los datos. Sin embargo, si está escribiendo archivos de gran tamaño, obviamente esta no es una opción.
  2. Escriba los datos en un archivo temporal y luego cópielos al resultado de la respuesta una vez que obtenga el tamaño del archivo. Dependiendo de lo que esté haciendo, esto puede tener una penalización de rendimiento que es inaceptable.
  3. Dependiendo de qué tan caro sea generar los datos en primer lugar, podría generarlos una vez y tirarlos para obtener el recuento y luego generarlos nuevamente. Adivinando que es poco probable que sea una solución realista.
  4. Resénese al hecho de que no podrá informar la longitud del contenido en el encabezado de respuesta.
Cuestiones relacionadas