De hecho, no necesita hacerlo.
Regla de pulgar: si no la ha creado/abierto usted mismo usando new SomeOutputStream()
, entonces no necesita cerrarla usted mismo. Si fue por ejemplo un new FileOutputStream("c:/foo.txt")
, entonces obviamente necesita cerrarlo usted mismo.
Razones por las que algunas personas todavía lo hacen son solo para asegurar que nada más se escribirá en el cuerpo de la respuesta. Si alguna vez ocurriera, esto provocará un IllegalStateException
en los registros del servidor de aplicaciones, pero esto no afectaría al cliente, por lo que el cliente aún obtiene la respuesta adecuada. Esta también es una depuración más fácil para detectar los problemas potenciales en la cadena de solicitud-respuesta que no vería a primera vista. Por ejemplo, algo más está agregando más datos al cuerpo de respuesta en algún lugar más abajo de la cadena.
Otra razón que se ve entre los principiantes es que solo querían evitar que se escriben más datos en el cuerpo de la respuesta. Ve esto a menudo cuando JSP desempeña un papel incorrecto en la respuesta. Simplemente ignoran el IllegalStateException
s en los registros. Huelga decir que este propósito particular es malo.
Es posible que desee cerrar la secuencia si ha abierto otro InputStream para envolverlo porque el contenedor no tendrá visibilidad de la secuencia de ajuste, que puede contener bytes no comprometidos. Lo ideal sería simplemente enjuagar() el flujo de ajuste, si es algo así como un BufferedOutputStream, pero descubrí cuando uso CipherOutputStream que esta clase no escribe completamente los datos (creo que con una buena razón en este caso). En esta situación, fue necesario llamar a close() para que el cliente obtuviera una respuesta correcta. –