Estoy escribiendo en el flujo de salida a través de varios métodos. ¿Cómo puedo, antes de cerrarlo, conocer la longitud del contenido de la salida de salida?Reponse outputstream content length?
Respuesta
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.
Puede considerar escribir en su propio ByteArrayOutputStream y vaciarlo al flujo de salida de respuesta al final.
Sin embargo, quedará muy ocupado de memoria ya que cada byte de un byte [] consume un byte de la memoria de JVM. – BalusC
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:
- 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.
- 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.
- 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.
- Resénese al hecho de que no podrá informar la longitud del contenido en el encabezado de respuesta.
- 1. encabezado Content-Length ya presente
- 2. PHP cURL Content-Length y Content-Type incorrecto
- 3. content-length al usar la compresión http
- 4. ColdFusion: cómo configurar el encabezado Content-Length
- 5. Jersey cliente no establece Content-Length
- 6. PHP CURL: La configuración manual de la cabecera Content-Length
- 7. ¿Es necesario establecer Content-Length en mi encabezado de respuesta?
- 8. ¿Cuál es el campo "Content-Length" en el encabezado HTTP?
- 9. ¿Cómo puedo detectar este error? (POST Content-Length ...)
- 10. Encabezado HTTP - ntCoent-Length
- 11. Flask/Werkzeug cómo adjuntar el encabezado HTTP content-length al archivo download
- 12. No hay campo Content-Length en el encabezado de respuesta HTTP (motor de la aplicación google)
- 13. ¿Cómo verificar la longitud real del contenido contra el encabezado Content-Length?
- 14. Content-Length-cabecera no fijadas en la solicitud del cliente Jersey
- 15. ¿Cómo se configura Content-Length cuando se envía una solicitud POST en NodeJS?
- 16. Obtener tamaño de archivo desde la carga de formulario multiparte Content-Length header
- 17. El módulo gestionado IIS 7 no puede obtener Content-Length o bytes enviados
- 18. wkhtmltopdf outputstream & download - diaglog
- 19. Java OutputStream Omitir (desplazamiento)
- 20. Writer o OutputStream?
- 21. Android EditText Max Length
- 22. SQL CE Max Length
- 23. ¿Puedo redefinir String # length?
- 24. NSString Length - Caracteres especiales
- 25. std :: wstring length
- 26. iOS URL Scheme Length
- 27. MySQL - length() vs char_length()
- 28. boost :: python :: list length
- 29. OutputStream OutOfMemoryError al enviar HTTP
- 30. ¿Debo cerrar el servlet outputstream?
U, Apache Commons! ¡Tengo que empezar a no olvidarme de Apache Commons! Intentaré. – Trick
Está funcionando :) – Trick
¿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ó –