2009-12-01 13 views
48

Duplicar posible:
Should one call .close() on HttpServletResponse.getOutputStream()/.getWriter()?¿Debo cerrar el servlet outputstream?

Soy responsable por el cierre de la HttpServletResponse.getOutputStream() (o el getWriter() o incluso el flujo de entrada) o debería dejar en manos de la envase ?

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
    OutputStream o = response.getOutputStream(); 
    ... 
    o.close(); //yes/no ? 
} 

Respuesta

59

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.

+1

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. –

8

No, no es necesario que lo cierre. Si lo haces, básicamente terminas la respuesta al cliente. Después de cerrar la transmisión, no puede enviar nada más al cliente hasta la siguiente solicitud. No abriste la transmisión, por lo que no tienes que cerrarla.

+14

Derecha. Como en una granja: abandona las puertas exactamente como las encontraste. – erickson

Cuestiones relacionadas