Moet ik de uitvoerstroom van de servlet sluiten?

Mogelijk duplicaat:
Moet men .close() aanroepen op HttpServletResponse.getOutputStream()/.getWriter ()?

Ben ik verantwoordelijk voor het sluiten van de HttpServletResponse.getOutputStream() (of de getWriter() of zelfs de inputstream)
of moet ik het aan de container overlaten?

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

Antwoord 1, autoriteit 100%

U hoeft dit inderdaad niet te doen.

Duimregel: als je het niet zelf hebt gemaakt/geopend met new SomeOutputStream(), dan hoef je het niet zelf te sluiten. Als het bijvoorbeeld een new FileOutputStream("c:/foo.txt")was, dan moet je deze natuurlijk zelf sluiten.

Redenen waarom sommige mensen het nog steeds doen, zijn gewoon om ervoor te zorgendat er niets meer naar de antwoordinstantie wordt geschreven. Als het ooit zou gebeuren, dan zal dit een IllegalStateExceptionveroorzaken in de appserver logs, maar dit heeft geen invloed op de client, dus de client krijgt nog steeds het juiste antwoord. Dit is ook een gemakkelijkere foutopsporing om potentiële problemen in de verzoek-antwoordketen te ontdekken die u op het eerste gezicht niet zou zien. Iets anders is bijvoorbeeld het toevoegen van meer gegevens aan de antwoordinstantie ergens verderop in de keten.

Een andere reden die je ziet bij starters is dat ze gewoon wilden voorkomendat er meer gegevens naar de antwoordtekst worden geschreven. Je ziet dit vaak wanneer JSP ten onrechte een rol speelt in de respons. Ze negeren gewoon de IllegalStateExceptions in de logs. Onnodig te zeggen dat dit specifieke doel slechtis.


Antwoord 2, autoriteit 12%

Nee, je hoeft het niet te sluiten. Als je dat doet, beëindig je in feite de reactie aan de klant. Na het sluiten van de stream kun je tot het volgende verzoek niets meer naar de klant sturen. Je hebt de stream niet geopend, dus je hoeft hem niet te sluiten.

Other episodes