Duplicata possible:
Faut-il appeler .close () sur HttpServletResponse.getOutputStream () /. GetWriter ()?
Suis-je responsable de la fermeture de HttpServletResponse.getOutputStream () (ou de getWriter () ou même du flux d'entrée) ou dois-je le laisser au conteneur?
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
OutputStream o = response.getOutputStream();
...
o.close(); //yes/no ?
}
Vous n'avez en effet pas besoin de le faire.
Règle du pouce: si vous ne l'avez pas créé/ouvert vous-même à l'aide de new SomeOutputStream()
, vous n'avez pas besoin de le fermer vous-même. Si c'était par exemple une new FileOutputStream("c:/foo.txt")
, alors vous devez évidemment la fermer vous-même.
Les raisons pour lesquelles certaines personnes le font encore sont simplement pour assurer que rien de plus ne sera écrit dans le corps de la réponse. Si cela devait arriver, cela entraînerait un IllegalStateException
dans les journaux du serveur d'applications, mais cela n'affecterait pas le client, donc le client obtient toujours la réponse appropriée. C'est également un débogage plus facile pour repérer les problèmes potentiels dans la chaîne de demande-réponse que vous ne verriez pas à première vue. Par exemple, quelque chose d'autre ajoute plus de données au corps de réponse quelque part plus bas dans la chaîne.
Une autre raison que vous voyez parmi les démarreurs est qu'ils voulaient juste empêcher que plus de données soient écrites dans le corps de la réponse. Vous le voyez souvent lorsque JSP ne joue pas correctement un rôle dans la réponse. Ils ignorent simplement les IllegalStateException
dans les journaux. Inutile de dire que ce but particulier est mauvais.
Non, vous n'avez pas besoin de le fermer. Si vous le faites, vous terminez la réponse au client. Après avoir fermé le flux, vous ne pouvez rien envoyer d'autre au client jusqu'à la prochaine demande. Vous n'avez pas ouvert le flux, vous n'avez donc pas à le fermer.