2009-12-01 8 views
48

Eventuali duplicati:
Should one call .close() on HttpServletResponse.getOutputStream()/.getWriter()?Devo chiudere il flusso di output del servlet?

sono io responsabile per la chiusura del HttpServletResponse.getOutputStream() (o il getWriter() o anche l'InputStream) o dovrei lasciare al contenitore?

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

risposta

59

In effetti non è necessario.

Regola del pollice: se non lo hai creato/aperto da solo utilizzando new SomeOutputStream(), non è necessario chiuderlo da solo. Se fosse per esempio uno new FileOutputStream("c:/foo.txt"), allora ovviamente hai bisogno di chiuderlo da solo.

I motivi per cui alcune persone lo fanno ancora sono solo per assicurare che non verrà scritto nient'altro nel corpo della risposta. Se ciò dovesse accadere, ciò causerebbe un IllegalStateException nei registri dell'appserver, ma ciò non influirebbe sul client, quindi il client otterrà comunque la risposta corretta. Questo è anche un debug più facile per individuare i potenziali problemi nella catena richiesta-risposta che non si vedrebbero a prima vista. Ad esempio, qualcos'altro aggiunge altri dati al corpo della risposta da qualche parte più in basso nella catena.

Un'altra ragione che si vede tra i principianti è che volevano solo impedire che più dati siano scritti nel corpo della risposta. Lo si vede spesso quando JSP ha un ruolo non corretto nella risposta. Ignorano semplicemente i IllegalStateException nei registri. Inutile dire che questo particolare scopo è cattivo.

+1

Si consiglia di chiudere lo stream se è stato aperto un altro InputStream per eseguire il wrapping poiché il contenitore non avrà visibilità del flusso di wrapping, che potrebbe contenere byte non salvati. Idealmente si sarebbe flush() il flusso di wrapping, se si tratta di qualcosa come BufferedOutputStream, ma ho scoperto quando si utilizza CipherOutputStream che questa classe non scrive completamente i dati (credo con una buona ragione in questo caso). In questa situazione era necessario chiamare close() affinché il client ottenga una risposta corretta. –

8

No non è necessario chiuderlo. Se lo fai fondamentalmente finisci la risposta al cliente. Dopo aver chiuso lo stream non è possibile inviare altro al client fino alla richiesta successiva. Non hai aperto lo stream, quindi non devi chiuderlo.

+14

Giusto. Proprio come in una fattoria: lascia le porte esattamente come le hai trovate. – erickson

Problemi correlati